→ ken1325:我執行你的程式碼,是回傳30。 07/26 12:40
→ newsted5566:我的電腦是mac 07/26 13:33
→ howardxu:// 改成 / 就對了 為什麼要用//? 07/26 14:31
看起來像是平台差異, 浮點數誤差和 floor division 合力造成的有趣現象
以下「前者」指 Windows (Python 2.7.5, MSC 64 bit)
「後者」則是 Mac OS X (Python 2.7.2, Apple Clang 4.0)
前者 math.asin(0.5) * 180 顯示 94.24777960769380
後者 94.24777960769379
這個差距似乎是兩個平台實作 arcsin 得到的結果不太一樣
不過哪個比較正確我就不知道了, 我不想手算驗證...
接下來 // d 就有趣了
// 在 Python 裡叫做 floor division (參見 PEP238)
這個除法會把出來的結果自動做 floor
原始用意是用來模仿類似 C 裡面 int a = 3 / 5; (會得到 1) 的行為
因為 math.pi 在兩個平台上都是 3.141592653589793
(感謝老天再後面一位是 2, 所以沒有進位問題)
數學上
94.24777960769380 / 3.141592653589793 約為 30.0000000000000031
94.24777960769379 / 3.141592653589793 則是 30 整
可是由於浮點數誤差, 真正出來的數字會比上面的小一點點
(我猜的, 這數字太大我實在是不想換算成 IEEE 754 來證明)
而前者仍然在 30 以上, 所以 // 會得到 30.0
後者則是變成很接近但小於 30, 出來就變成 29.0
應該是這樣吧
改用 / 的話因為 Python 會自動調整輸出
「比 30 大一點點」和「比 30 小一點點」的浮點數都會被顯示成 30.0
所以看起來兩者就會相同
順帶一題, 如果你真的需要準確的數學, 請考慮改用比較專門的 module
--
「我最想要的同伴嘛,首先是要笑口常開,其次是我們能永遠不會發生誤會。
如果這些都能辦到的話,嗯,如果他是世界上第一流的橋手,也還不錯。」
-- 班尼多‧加羅素,前義大利藍隊成員
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 114.32.81.146
推 lc85301:LOL 07/26 16:26
推 ya790206:C 語言的3/5 結果應該是0。至少在GCC下是這樣。 07/26 16:55
推 ck574b027:樓上XD 07/26 17:17
→ uranusjr:請自行帶換成 5 / 3... 07/26 18:40