2017-08-08 44 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