为清楚起见,如果我使用的是实现IEE 754浮点数的语言,我声明:
float f0 = 0.f;
float f1 = 1.f;
Run Code Online (Sandbox Code Playgroud)
...然后将它们打印出来,我会得到0.0000和1.0000 - 完全正确.
但IEEE 754无法表示实线上的所有数字.接近于零,"差距"很小; 当你越走越远时,差距越来越大.
所以,我的问题是:对于一个IEEE 754浮点数,这是第一个(最接近零)整数,无法准确表示?我现在只关心32位浮点数,虽然如果有人给出它我会有兴趣听到64位的答案!
我认为这就像计算2 bits_of_mantissa并添加1 一样简单,其中bits_of_mantissa是标准公开的位数.我在我的机器(MSVC++,Win64)上为32位浮点数做了这个,但它看起来很好.
我想知道从0d向上的第一个双重偏差"相同值"的长度偏离某个增量,比如1e-8.我虽然失败了.我试图在C中做这个,虽然我通常使用托管语言,以防万一.请帮忙.
#include <stdio.h>
#include <limits.h>
#define DELTA 1e-8
int main() {
double d = 0; // checked, the literal is fine
long i;
for (i = 0L; i < LONG_MAX; i++) {
d=i; // gcc does the cast right, i checked
if (d-i > DELTA || d-i < -DELTA) {
printf("%f", d);
break;
}
}
}Run Code Online (Sandbox Code Playgroud)
我猜测问题是di将我加倍,因此d == i然后差异总是为0.我还能检测到这一点 - 我更喜欢有趣的C转换比较比较字符串,这会永远.
答案:完全符合我们的预期.根据标准C/UNIX/POSIX工具,2 ^ 53 + 1 = 9007199254740993是第一个不同点.非常感谢pax的计划.我猜数学再次获胜.