不是纯数学意义上的方程, 对应计算机的一个浮点数问题:

1
if((float)(x+1.0) == (float)(x)) { x = ? }

简单分析, ieee754中float采用23bit表示有效位, 再加省略的1, 共有24bit. 当结果超出24bit时, 小数部分被被丢失.

大于 2^24 = 16777216 的x, 满足 x+1.0==x.

测试程序:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include <stdio.h>
// Little endian
union ieee754_float {
float f;
/* This is the IEEE 754 single-precision format. */
struct {
unsigned int mantissa:23;
unsigned int exponent:8;
unsigned int negative:1;
} ieee;
/* This format makes it easier to see if a NaN is a signalling NaN. */
struct {
unsigned int mantissa:22;
unsigned int quiet_nan:1;
unsigned int exponent:8;
unsigned int negative:1;
} ieee_nan;
};
int main()
{
union ieee754_float f = { 0.0f };
// Find a positive floating point value x, for which x+1.0=x.
for(f.ieee.exponent = 127; f.ieee.exponent < 255; f.ieee.exponent++) {
if((float)(f.f + 1.f) == f.f) {
printf("%f: exponent = %d\n", f.f, f.ieee.exponent);
}
}
return 0;
}
// output:
// 16777216.000000: exponent = 151
// 33554432.000000: exponent = 152
// 67108864.000000: exponent = 153
// 134217728.000000: exponent = 154
//
// ... ...
//
// 21267647932558654000000000000000000000.000000: exponent = 251
// 42535295865117308000000000000000000000.000000: exponent = 252
// 85070591730234616000000000000000000000.000000: exponent = 253
// 170141183460469230000000000000000000000.000000: exponent = 254

IEEE754相关资源: