[英]IEEE 754 floating point math
當使用IEEE754浮點數(在JavaScript中)時,與以下數學相關的精度損失的風險是什么?
10*.1
即整數乘以有理數。
注意:發布此答案后很長時間,已對問題進行了編輯,以添加“除數為”,有關更新,請參見折頁下面。
精度損失的風險是什么...
實際上 ,這是可以保證的 ,具體取決於所涉及的整數和浮點數,因為我們使用的內容(以10為底的小數)和實際的IEEE-754浮點數(以2為底的小數,然后以base表示)之間不匹配10供我們使用)。 正如我們不能代表10 / 3
精確地在基體10,也有不能准確地存儲在基座2中的各種基體10個的數字。
但是對於您的特定問題:中斷於3: 3 * 0.1
為0.30000000000000004
。
您甚至不需要乘法,但是加法已0.30000000000000004
,經典示例是0.1 + 0.2
,這也導致0.30000000000000004
。
示例(JavaScript編號是IEEE-754雙精度浮點數):
snippet.log(0.1 + 0.2); // 0.30000000000000004 snippet.log(3 * 0.1); // Also 0.30000000000000004
<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 --> <script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>
再加上您的“那是除數”:我認為您的意思是小數與原始整數有關,因此結果將是帶有實際數學運算的整數。
不,那也不安全。 :-)因為在以10為底的實際數學運算中會產生整數的分數值可能無法在IEEE-754的10的底數中精確表示,因此精度不正確。例如, 0.00000000002
證明了此問題:
snippet.log(200000000000 * 0.00000000002); // 3.9999999999999996
<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 --> <script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>
我不知道是否會有更大的價值引入不精確性,但這並不會讓我感到驚訝。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.