簡體   English   中英

IEEE 754浮點數學

[英]IEEE 754 floating point math

當使用IEEE754浮點數(在JavaScript中)時,與以下數學相關的精度損失的風險是什么?

10*.1

即整數乘以有理數。

注意:發布此答案后很長時間,已對問題進行了編輯,以添加“除數為”,有關更新,請參見折頁下面。


精度損失的風險是什么...

實際上 ,這是可以保證的 ,具體取決於所涉及的整數和浮點數,因為我們使用的內容(以10為底的小數)和實際的IEEE-754浮點數(以2為底的小數,然后以base表示)之間不匹配10供我們使用)。 正如我們不能代表10 / 3精確地在基體10,也有不能准確地存儲在基座2中的各種基體10個的數字。

但是對於您的特定問題:中斷於3: 3 * 0.10.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM