log base 2精度错误

时间:2017-08-08 08:19:57

标签: javascript floating-point

我想在JavaScript中获得浮点数的尾数。

所以我首先得到浮点数的指数部分 通过数学,指数为cbind( test[1:2], Closest_Column = apply(test[-1], 1, function(x) names(x[-1])[which.min( abs(x[-1]-x[1]))] ) ) Name Margin Closest_Column 1 A 744.000 T15 2 B 3196.472 T17 3 C 0.000 T19 4 D 394.000 T18

但是,JavaScript中没有floor(log2(x))函数 所以我从自然对数中得出它。但精确度很重要。

log2log2(pow(2, 3)) == 2.99999...

我该如何解决这个问题?感谢。

编辑:我不想使用ECMAScript6的floor(log2(pow(2, 3)) == 2

1 个答案:

答案 0 :(得分: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