【问题标题】:How is the smallest positive representable floating-point value determined?如何确定可表示的最小正浮点值?
【发布时间】:2018-11-05 15:39:27
【问题描述】:

只是好奇事情是如何运作的。 浮点最大值和 epsilon 值为

Single MaxValue = 3.40282347E+38F; // derived from 1.000.. * 2^128
Single Epsilon = 1.401298E-45F; // probably from substracting (1.00..01 - 1.00..0) * 2^-128 ?

但最小的正值应该在 1/MaxValue 或 1*2^-127 左右,这使得 ^-39 或 ^-38 是十进制数字的幂。那么浮点数怎么可能存储低于-38(到-45)的东西呢?

【问题讨论】:

  • “Epsilon”通常用于表示可表示数字之间的步长,通常是从 1 到下一个可表示值的步长。您询问的值是可表示的最小正值。
  • @EricPostpischil:不过,Microsoft 确实将 Single.Epsilon 定义为最小的正 IEEE 754 binary32 次正规。我不知道他们为什么选择这样一个令人困惑的名字。这种混淆导致 IronPython 错误地报告了 sys.float_info.epsilon 对应的 Double.Epsilon 值。

标签: c# floating-point


【解决方案1】:

对于非常小的数字,IEEE 754 浮点使用允许更小间隔的标准化值。

在计算机科学中,非正规数或非正规数(现在通常称为次正规数)填补了浮点算术中零附近的下溢间隙。任何幅度小于最小正规数的非零数都是“次正规数”。

在正常的浮点值中,有效数中没有前导零;而是将前导零移动到指数。所以 0.0123 可以写成 1.23 × 10−2。非正规数是这种表示将导致指数低于最小指数(指数通常具有有限范围)的数字。此类数字在有效数字中使用前导零表示。

有关详细信息,请参阅Wikipedia page on denormal numbersthe page on IEEE 754-1985,其中还列出了您偶然发现的数字 (10^-45)。

最接近零的正数和负数(由指数字段全为0,分数字段为二进制值1的非规范化值表示)是 ±2 ^ -149 ≈ ± 1.40130×10 ^ -45

【讨论】:

  • 谢谢,我错过了指数部分全为0的那一刻。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-11-26
  • 2021-04-23
  • 1970-01-01
  • 2019-04-30
  • 1970-01-01
  • 2011-01-18
  • 2016-03-26
相关资源
最近更新 更多