浮点数学的奇异之处我正在使用JMP15。
我最近意识到,我使用了一段时间的脚本中存在一个小错误,该错误源于一个浮点怪癖,如下所示。
前两行计算的数字相同-> 23。
当我使用ceiling函数时,第一个版本返回24,第二个版本返回23。
这应该发生吗?
显示((((1104/2016)* 42));
显示(((42 * 1104/2016)));
show(天花板((1104/2016)* 42));
show(天花板((42 * 1104/2016)));
/ *:
(1104/2016)* 42 = 23;
42 * 1104/2016 = 23;
天花板((1104/2016)* 42)= 24;
上限(42 * 1104/2016)= 23;
脚本编写回复:浮点数学的怪异您已经看到这是一个浮点怪癖。如果发生这种情况,从技术上讲不会,但是由于浮点计算,总会有奇怪的“取整问题”。
如果将第一个计算放到列(1104/2016)* 42中,将列的宽度更改为30(任意大),将其格式设置为“固定小数”并保留20个小数位,您将看到该数字存储为:23.00000000000000355271 。
回复:浮点数学的怪异2016:2×2×2×2×2×3×3×7
1104:2×2×2×2×3×23
42:2×3×7
1104/2016是( 2×2×2×2×3× 23)/( 2×2×2×2× 2× 3× 3×7)
23 /(2×3×7)是基数10和基数2(十六进制,基数16,每十六进制显示4位)的重复分数:
0.5476190476190476190476190 ... 或3FE186186186186 ... (幸运的12位重复可视化!)
两者均被截断且不精确。十六进制基数2表示形式的实际值四舍五入为3FE1861861861861862,该值略高(3FE是指数)。除以42后再乘以42,也略高。
(42×1104)/ 2016是(( 2×3×7 )×( 2×2×2×2×3× 23))/( 2×2×2×2×2×3×3×7 )
在除法运算之前乘以42,可以很好地减少主除数。
回复:浮点数学的怪异我想我要框定这个答案