浮點數學的奇異之處我正在使用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,可以很好地減少主除數。
回复:浮點數學的怪異我想我要框定這個答案