发布于 2014-05-09 00:25:24
14楼
廖老师,
其实我已经似乎明白这个道理,就是说不出来!
2147483520是个非常特殊的值(见2楼计算),此时,指数= 157-127 = 30,底数=2#11111111111111111111111,如果继续加大浮点数的值,只能指数进位,而将底数清零,即,指数 = 158 -127 = 31,底数=2#00000000000000000000000,这就是为什么您在一楼得出结论:
“...大于2147483456.0 ~ 2147483584.0时(区间范围为128.0),转换后得到的双整数均为2147483520"。
假如真的指数进位,底数清零,那就会出现:(Sign)*(1.f)*(2e-127) = 2^31*1.0 = 2147483648.0,超出了有符号双整数范围了!
我知道单精度32位浮点数有效位7位,双整数10位,但是,我一直是从浮点数二进制格式来分析这个问题的。
浮点数不是数学中的实数,是用2^0 + 2^-1 + 2^-2 + 2^-3 + 2^-4 + 2^-5 + 2^-6 + 2^-7 + 2^-8 + 2^-9 + 2^-10 + 2^-11 + 2^-12 + 2^-13 + 2^-14 + 2^-15 + 2^-16 + 2^-17 + 2^-18 + 2^-19 + 2^-20 + 2^-21 + 2^-22 + 2^-23
这些所谓底数“拼”出来的,所以实数是连续的,而浮点数会出现“断点”(误差)!
人的生命似洪水在奔流,不遇着岛屿、暗礁,难以激起美丽的浪花。