Tor*_*ein 9 vba casting rounding floating-accuracy
这是我的VBE(MS Excel 2007 VBA)中的一个小宝石:
?clng(150*0.85)
127
x = 150*0.85
?clng(x)
128
Run Code Online (Sandbox Code Playgroud)
任何人都可以解释这种行为吗?恕我直言,第一个表达式应该产生128(.5舍入到最接近的偶数),或者至少应该两个结果相等.
Ric*_*gan 11
我认为wqw是对的,但我会详细说明.
在语句中clng(150 * 0.85),150 * 0.85以扩展精度计算:
150 = 1.001011 x 2^7
Run Code Online (Sandbox Code Playgroud)
0.85 双精度=
1.1011001100110011001100110011001100110011001100110011 x 2^-1
Run Code Online (Sandbox Code Playgroud)
手动乘以这些,你得到
1.1111110111111111111111111111111111111111111111111111110001 x 2^6 =
127.4999999999999966693309261245303787291049957275390625
Run Code Online (Sandbox Code Playgroud)
这是59位,非常适合扩展精度.它不是127.5那么圆.
在声明中x = 150 * 0.85,59位值被舍入到53位,给出
1.1111111 x 2^6 = 1111111.1 = 127.5
Run Code Online (Sandbox Code Playgroud)
所以它按照半个到一个一半的顺序进行.
(有关更多信息,请参阅我的文章http://www.exploringbinary.com/when-doubles-dont-behave-like-doubles/.)
| 归档时间: |
|
| 查看次数: |
1908 次 |
| 最近记录: |