INT32 中可以用 float 精确表示的第一个和最后一个值是什么?
What is the first and last value from INT32 that can be represented exactly in float?
我知道 2^24 以上的浮点数会损失精度。我的问题是最后一个 int32 值是什么,它可以用 float 精确表示,同时小于 INT32_MAX。根据相同的原则,在 float 中具有精确表示的最小 int32 值是多少?我说的是单精度浮点格式。
谢谢,
假设此处的 float
表示 IEEE 754 单精度,因为它几乎总是如此,当转换为 INT32_MAX
时向上舍入为 231 =11=],因此您可以获得可以完全表示为 float
和 int32_t
的最大值:
nextafterf(INT32_MAX, 0)
即:2147483520
这个数字比 231 低 128,符合该地区 ULP 为 128 的预期,因为我们是 27 倍于最大整数以上,低于该最大整数可表示所有整数。
也可表示为浮点数的最小 int32_t
值是 -231.
解释此问题的另一种方法是 largest/smallest int32_t 值是什么,其中 adding/subtracting 1 导致的数字正好比原始数字多 1 more/less ?
由于尾数中有 23 + 1 = 24 位,因此适合的最大数字为 2^0+2^1 + ... +2^22+2^23 或 2^24-1或 16777215。如果向其添加一个,您将得到 2^24 或 16777216。如果向 16777216 添加一个,您仍将有 16777216,因为在浮点格式中,可以增加 1 的最大整数是 2^24-1 .
之后,2^24到2^25-2可以增加2。从2^25到2^26-4增加4。2^26到2^27-8增加8和依此类推
负 int32_t 值的作用类似:从 2^24-1 中减去 1 得到 -2^24。从 -2^24 到 -2^25-2 等等。
我知道 2^24 以上的浮点数会损失精度。我的问题是最后一个 int32 值是什么,它可以用 float 精确表示,同时小于 INT32_MAX。根据相同的原则,在 float 中具有精确表示的最小 int32 值是多少?我说的是单精度浮点格式。 谢谢,
假设此处的 float
表示 IEEE 754 单精度,因为它几乎总是如此,当转换为 INT32_MAX
时向上舍入为 231 =11=],因此您可以获得可以完全表示为 float
和 int32_t
的最大值:
nextafterf(INT32_MAX, 0)
即:2147483520
这个数字比 231 低 128,符合该地区 ULP 为 128 的预期,因为我们是 27 倍于最大整数以上,低于该最大整数可表示所有整数。
也可表示为浮点数的最小 int32_t
值是 -231.
解释此问题的另一种方法是 largest/smallest int32_t 值是什么,其中 adding/subtracting 1 导致的数字正好比原始数字多 1 more/less ?
由于尾数中有 23 + 1 = 24 位,因此适合的最大数字为 2^0+2^1 + ... +2^22+2^23 或 2^24-1或 16777215。如果向其添加一个,您将得到 2^24 或 16777216。如果向 16777216 添加一个,您仍将有 16777216,因为在浮点格式中,可以增加 1 的最大整数是 2^24-1 .
之后,2^24到2^25-2可以增加2。从2^25到2^26-4增加4。2^26到2^27-8增加8和依此类推
负 int32_t 值的作用类似:从 2^24-1 中减去 1 得到 -2^24。从 -2^24 到 -2^25-2 等等。