为什么是numpy.nextafter(0。,1.)!= numpy.finfo(float).tiny?

时间:2018-10-11 09:06:38

标签: python python-3.x numpy floating-point

this answer的启发,我不知道为什么numpy.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

有人对此有解释吗?

1 个答案:

答案 0 :(得分:3)

The documentation的措辞不好; “可用”是通俗易懂的,没有定义。显然tiny是最小的 normal 正数。

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

Python并不严格指定其浮点属性。 Python实现通常从底层硬件或软件继承它们,并且使用IEEE-754格式(但不完全符合IEEE-754语义)是常见的。在IEEE-754中,数字用有效位数 1 中的隐式前一位表示,直到指数达到该格式的最小值为止,此后隐式位为零而不是1,较小的值为只能通过减小有效位数而不是减小指数来表示。这些具有隐式前导零的数字是次正规数。它们用于保留一些有用的算术属性,例如,当且仅当x-y == 0时,才保留x == y。 (没有次级数,两个非常小的数字可能会有所不同,但它们的更小的差异可能无法表示,因为它低于指数极限,因此计算x-y会舍入为零,从而产生类似{{1} }出现被零除的错误。)

注意

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