【问题标题】:Which is the first integer that an IEEE 754 float is incapable of representing exactly?IEEE 754 浮点数无法准确表示的第一个整数是哪个?
【发布时间】:2011-04-17 04:03:02
【问题描述】:

为了清楚起见,如果我使用的是实现 IEE 754 浮点数的语言并声明:

float f0 = 0.f;
float f1 = 1.f;

...然后将它们打印出来,我会得到 0.0000 和 1.0000 - 完全正确。

但是 IEEE 754 不能代表实线中的所有数字。接近于零,“差距”很小;距离越远,差距越大。

所以,我的问题是:对于 IEEE 754 浮点数,它是第一个(最接近于零)无法精确表示的整数?我只关心 32 位浮点数现在,尽管如果有人给出 64 位的答案,我会很感兴趣!

我认为这就像计算 2bits_of_mantissa 并加 1 一样简单,其中 bits_of_mantissa 是标准公开的位数。我在我的机器(MSVC++,Win64)上为 32 位浮点数做了这个,不过看起来还不错。

【问题讨论】:

  • 如果您想要一个无法代表的数字,为什么要添加一个?您使用或获得了什么号码?这是作业吗?你的问题标题是“integer”,但你的问题是“float”。
  • 因为我认为最大化尾数会给我最大的可表示数字。 2^22。不,这是一个好奇的问题。即使我知道所讨论的 int 总是非常小,我也一直对将 int 放入浮点数感到内疚。我想知道上限是多少。据我所知,标题和问题是相同的,只是措辞不同。
  • @KyleStrand 已恢复^2。我不知道为什么当时一个对我来说似乎比另一个更正确。现在,与“……是位数……”相比,它们都显得很尴尬

标签: types floating-point ieee-754


【解决方案1】:

2尾数位 + 1 + 1

指数中的 +1(尾数位 + 1)是因为,如果尾数包含 abcdef...,则它所代表的数字实际上是 1.abcdef... × 2^e,提供了额外的隐含精度。

因此,第一个无法准确表示且将被四舍五入的整数是:
对于float,16,777,217 (224 + 1)。
对于double,9,007,199,254,740,993 (253 + 1)。

>>> 9007199254740993.0
9007199254740992

【讨论】:

  • 我声明了 float 并将其设置为等于 16,777,217。但是当我使用cout 打印它时,结果是 16,777,216。我正在使用C++。为什么我不能得到 16,777,217?
  • @sodiumnitrate 检查问题标题。 16777217 是第一个不能精确表示的整数。
  • 好的,谢谢。我很困惑,对此感到抱歉。不过我还有一个问题:在 16777216 之后,下一个可表示的整数不应该是 2*16777216 吗?当我运行一个类似的程序时,我通过在 16777126 上加 2 得到 16777218。
  • 下一个整数确实是 16777218,因为 2 现在成为最后一个有效二进制数字。
  • 在 C++ 中是 (1 << std::numeric_limits<float>::digits) + 1,在 C 中是 (1 << FLT_MANT_DIG) + 1。前者很好,因为它可以成为模板的一部分。如果您只想要最大的可表示整数,请不要添加 +1。
【解决方案2】:

n位整数可表示的最大值为2n-1。如上所述,float 的有效位精度为 24 位,这似乎意味着 224 不适合。

但是 .

指数范围内 2 的幂完全可以表示为 1.0×2n,所以 224可以适合,因此float 的第一个不可表示的整数是 224+1。如上所述。再次。

【讨论】:

  • 这清楚地解释了另一个的“额外隐含的精度”部分。谢谢。
猜你喜欢
  • 2016-02-09
  • 2012-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-06
  • 1970-01-01
相关资源
最近更新 更多