【问题标题】:log base 2 precision error对数基数 2 精度误差
【发布时间】:2018-01-15 17:00:26
【问题描述】:

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

所以我首先得到浮点数的指数部分。
根据数学,指数是floor(log2(x))

但是,JavaScript 中没有 log2 函数。
所以我用自然对数来计算。但精度很重要。

自从log2(pow(2, 3)) == 2.99999...floor(log2(pow(2, 3)) == 2

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

编辑:我不想使用 ECMAScript6 的 Math.log2

【问题讨论】:

  • 请编辑您的代码,以便其他人可以轻松阅读。

标签: javascript floating-point


【解决方案1】:

您不能像在数学中那样在编程中使用数字。有一些技巧和注意事项,与数字精度有关。

例如,您不应该直接比较两个数字:

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

【讨论】:

  • 对于这个例子 (2.9999999 E 是0.000000000000001 (10**-15);但我认为由于 Javascript 使用浮点值,所以要下限的数字越大,对应的 E 应该越大
猜你喜欢
  • 1970-01-01
  • 2014-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-30
  • 1970-01-01
  • 2020-07-31
  • 2017-11-11
相关资源
最近更新 更多