首页 > 解决方案 > 为什么 numpy.nextafter(0., 1.) != numpy.finfo(float).tiny?

问题描述

这个答案的启发,我想知道为什么对于来自andnumpy.nextafter的最小正浮点数给出不同的结果:numpy.finfo(float).tinysys.float_info.min

import numpy, sys

nextafter = numpy.nextafter(0., 1.) # 5e-324
tiny = numpy.finfo(float).tiny # 2.2250738585072014e-308
info = sys.float_info.min # 2.2250738585072014e-308

根据文件:

numpy.nextafter

将 x1 之后的下一个浮点值按元素返回到 x2。

finfo(float).tiny

最小的正可用数。类型tiny是适当的浮点类型。

sys.float_info

一个 structseq 保存有关浮点类型的信息。它包含有关精度和内部表示的低级信息。请研究您系统的 :file:float.h以获取更多信息。

有人对此有解释吗?

标签: pythonpython-3.xnumpyfloating-point

解决方案


文档对此的措辞很糟糕;“可用”是口语化的,没有定义。显然tiny是指最小的正法线

nextafter在零之后返回实际的下一个可表示值,即subnormal

Python 没有严格指定其浮点属性。Python 实现通常从底层硬件或软件继承它们,并且使用 IEEE-754 格式(但不完全符合 IEEE-754 语义)很常见。在 IEEE-754 中,数字在有效数字1中用隐式前导一位表示,直到指数达到其格式的最小值,之后隐式位为零而不是一,更小的值只能通过减少有效数字来表示减少指数。这些带有隐式前导零的数字是次正规数。它们用于保留一些有用的算术属性,例如x-y == 0当且仅当x == y. (没有次正规数,两个非常小的数可能不同,但它们更小的差异可能无法表示,因为它低于指数限制,因此计算x-y将舍入为零,导致代码if (x != y) quotient = t / (x-y)出现被零除的错误。 )

笔记

1 “有效数”是专家对浮点表示的小数部分首选的术语。“尾数”是对数的小数部分的旧术语。尾数是对数的,而有效数是线性的。


推荐阅读