2017-08-08 45 views
0

我想要在JavaScript中獲得浮點數的尾數。日誌庫2精度錯誤

所以我首先得到浮點數的指數部分。
通過數學,指數是floor(log2(x))

但是,在JavaScript中沒有log2函數。
所以我把它從自然對數。但精確性是重要的。

由於log2(pow(2, 3)) == 2.99999...floor(log2(pow(2, 3)) == 2

我該如何解決這個問題?謝謝。

編輯:我不想使用ECMAScript6的Math.log2

+0

請編輯您的代碼,以便其他人可以輕鬆閱讀。 – UmarZaii

回答

0

你不能在編程中像數學一樣使用數字。有一些技巧和考慮,與數字精度有關。

例如,你不應該直接比較兩個數字:

if (a === b) { ... } // wrong, 0.2999999999 !== 0.3 

相反,你需要檢查,如果它們之間的差值小於小東西:

var E = 0.000001; 
if (Math.abs(a - b) < E) { ... } // right, abs(0.2999999999 - 0.3) < 0.000001 

這將保證該數字與指定的精度進行比較。

您可以簡單地應用相同的技巧來正確地將您的號碼向下舍入。
既然你把你的電話號碼降低了,那麼只需在其中添加E即可。

var E = 0.000001; 
var result = Math.floor(log2(pow(2, 3) + E); // it is 3, not 2 

請注意,這個E值是一個例子。
你需要找到一個好的E爲您的計算:更大的E將導致更差的精度,太小E將使其無法正常工作。如果你使用總數爲整數的大數字,那麼你可以使用相當大的E

+0

在這個例子中('2.9999999' <3),最小的'E'是'0.000000000000001'('10 ** - 15');但是我認爲自Javascript使用浮點值以後,那麼數字就會越大,相應的E就越大 – NatNgs