python - 为什么 numpy.nextafter(0., 1.) != numpy.finfo(float).tiny?
问题描述
受这个答案的启发,我想知道为什么对于来自andnumpy.nextafter
的最小正浮点数给出不同的结果:numpy.finfo(float).tiny
sys.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
以获取更多信息。
有人对此有解释吗?
解决方案
文档对此的措辞很糟糕;“可用”是口语化的,没有定义。显然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 “有效数”是专家对浮点表示的小数部分首选的术语。“尾数”是对数的小数部分的旧术语。尾数是对数的,而有效数是线性的。
推荐阅读
- python - 创建一个python算法来训练一个keras模型来预测一个大的整数序列
- r - 如何计算一年中365天的一天的指数?
- amazon-web-services - 如何使用 cloudformation 创建私有 AWS Api 网关?
- python - 在可分发的 python 脚本中导入
- c# - 引用类型返回值与无效(非返回值)函数
- c# - 如何在属性中返回多个变量
- django - Django 无法投射日期时间
- apache-spark - Spark - 工人没有足够的资源
- google-cloud-platform - 列出 GCP 帐户/组织的所有用户
- python - 从文件构造结构化的numpy数组?