不是纯数学意义上的方程, 对应计算机的一个浮点数问题:
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> union ieee754_float { float f; struct { unsigned int mantissa:23; unsigned int exponent:8; unsigned int negative:1; } ieee; 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 }; 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; }
|
IEEE754相关资源: