我想在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))
函数
所以我从自然对数中得出它。但精确度很重要。
自log2
,log2(pow(2, 3)) == 2.99999...
。
我该如何解决这个问题?感谢。
编辑:我不想使用ECMAScript6的floor(log2(pow(2, 3)) == 2
。
答案 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
。