Types 哪一个是IEEE 754浮点不能精确表示的第一个整数?

Types 哪一个是IEEE 754浮点不能精确表示的第一个整数?,types,floating-point,ieee-754,Types,Floating Point,Ieee 754,为清楚起见,如果我使用的是实现IEE 754浮动的语言,我声明: float f0 = 0.f; float f1 = 1.f; …然后把它们打印出来,我会得到0.0000和1.0000-准确地说 但是IEEE754不能代表实线上的所有数字。接近于零,“差距”很小;离得越远,间隙越大 所以,我的问题是:对于IEEE 754浮点,哪一个是第一个(最接近零的)不能精确表示的整数?我现在只关心32位浮点,尽管如果有人给出64位浮点,我很想听到答案 我认为这就像计算2比特尾数加1一样简单,其中比特尾数

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

float f0 = 0.f;
float f1 = 1.f;
…然后把它们打印出来,我会得到0.0000和1.0000-准确地说

但是IEEE754不能代表实线上的所有数字。接近于零,“差距”很小;离得越远,间隙越大

所以,我的问题是:对于IEEE 754浮点,哪一个是第一个(最接近零的)不能精确表示的整数?我现在只关心32位浮点,尽管如果有人给出64位浮点,我很想听到答案

我认为这就像计算2比特尾数加1一样简单,其中比特尾数是标准暴露的比特数。我在我的机器(MSVC++,Win64)上对32位浮点进行了此操作,但它看起来很好。

2Mantisa位+1+1

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

因此,无法准确表示且将被舍入的第一个整数是:
对于浮动,16777217(224+1)。
对于双精度
,9007199254740993(253+1)


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

但是。


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

如果你想要一个不可再现的数字,为什么还要加一个?你用的是什么号码?这是家庭作业吗?你的问题标题是“整数”,但你的问题是“浮点”。因为我想最大化尾数会得到最高的可表示数。2^22. 不,这是个好奇的问题。我总是觉得把整数放在浮点数里很内疚,即使我知道所讨论的整数总是很小。我想知道上限是多少。据我所知,标题和问题是一样的,只是措辞不同。可能是重复的吗?@KyleStrand回复^2。我不知道为什么一个在我看来比另一个更正确。现在,与“…是位数…”相比,它们看起来都很尴尬。我声明了一个
浮点值,并将其设置为16777217。但当我使用
cout
打印它时,结果是16777216。我正在使用
C++
。为什么我不能得到16777217?@sodiumnitrate检查问题标题。16777217是第一个无法精确表示的整数。好的,谢谢。我很困惑,很抱歉。不过我还有一个问题:在16777216之后,下一个可表示的整数不应该是2*16777216吗?当我运行一个类似的程序时,我通过添加2到16777126得到16777218,下一个整数实际上是16777218,因为现在2变成了最后一个重要的二进制数字。在C++中,这是<代码>(1),这清楚地解释了“额外的隐精度”部分。谢谢。
>>> 9007199254740993.0
9007199254740992