首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果你把最小的正浮点值乘以一个非零的数字,你能保证一个非零的结果吗?

如果你把最小的正浮点值乘以一个非零的数字,你能保证一个非零的结果吗?
EN

Stack Overflow用户
提问于 2017-06-05 17:25:54
回答 2查看 1.4K关注 0票数 5

如果我取epsilon为最小的正非零浮点数(无论是1632还是64位),并将epsilon乘以相同大小的非零浮点值:

是否保证与原始值相同的符号的非零结果?或者我是否要冒舍入错误(零,或切换符号)的风险?

环境: Python/Numpy

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-06-05 17:33:43

不是的。

代码语言:javascript
复制
In [1]: import numpy

In [2]: x = numpy.nextafter(0, 1)

In [3]: x
Out[3]: 4.9406564584124654e-324

In [4]: x*x
Out[4]: 0.0

当精确的结果介于0到最小的正浮点数之间时,它必须舍入其中的一个选项,在这种情况下,0更接近。

如果出于某种原因要自定义此行为,NumPy允许您使用numpy.seterr自定义下流和其他IEEE 754浮点异常的行为,尽管它不会影响对普通Python对象的操作:

代码语言:javascript
复制
In [5]: numpy.seterr(under='raise')
Out[5]: {'divide': 'warn', 'invalid': 'warn', 'over': 'warn', 'under': 'ignore'}

In [6]: x # NumPy float, not regular float, despite its looks
Out[6]: 4.9406564584124654e-324

In [7]: x*x
---------------------------------------------------------------------------
FloatingPointError                        Traceback (most recent call last)
<ipython-input-7-a3ff2a28c75d> in <module>()
----> 1 x*x

FloatingPointError: underflow encountered in double_scalars

In [8]: (4.9406564584124654e-324)**2 # regular float
Out[8]: 0.0

没有办法改变舍入模式。

票数 9
EN

Stack Overflow用户

发布于 2017-06-05 17:34:12

当然不是,而epsilon和这件事没有什么关系。例如,

代码语言:javascript
复制
>>> x = 1e-200
>>> x
1e-200

远不是epsilon,但是

代码语言:javascript
复制
>>> x * x
0.0

潜流到0。如果我们真的用epsilon代替,那么,例如,乘以0.25,也会流到0。

但是,如果您的platform C编译器和硬件支持754标准,则零的符号将与乘数的符号匹配:

代码语言:javascript
复制
>>> x * -x
-0.0
票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44374371

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档