【问题标题】:Simple formula in Javascript is infinityJavascript中的简单公式是无穷大
【发布时间】:2014-07-22 19:22:58
【问题描述】:

我在 Wolfram 中有以下公式:

记录以 10 为底的 (10^-18x)

WolframLink(以 x 为例)

首先是日志功能:

function getLog(y) {
    return Math.log(y)/Math.log(10);
}

现在我正在尝试获得我的价值:

var x = Math.pow(10,33);
var faktor = getLog(Math.pow(10,-(18*x)));
console.log(faktor);

控制台给出-Infinity

我的代码有什么问题?感谢您的帮助。

【问题讨论】:

  • 那么有没有可能用 Javascript 来计算呢?
  • 哎呀我删除了我的评论!原评论是you are overflowing javascript's maximum int
  • 是的,我看到了。那么是否有机会获得解决方法或者我需要 Ajax 请求?

标签: javascript math logarithm


【解决方案1】:

您的计算导致浮点 underflow。浮点数大致表示为 0. × 2,因此可表示值 x 的 log(|x|) 分布是均匀密集的。尾数和指数都为它们分配了一定数量的位。表示的指数只能变得这么小,如果你试图让它小于最小值,表示就会被强制舍入为0。

您可以改为使用these identities 在日志空间中执行计算。此处列出了其中的一些。

  • log(x × y) = log(x) + log(y)
  • log(x / y) = log(x) - log(y)
  • log(xy) = y × log(x)

【讨论】:

  • 所以我的公式会变成var faktor = (-18*x)*getLog(10);,这意味着我不再需要日志了吗?
  • @wernersbacher 你正在计算var faktor = getLog(Math.pow(10,-(18*x)));。那是 log10(exp10(-18x)) = -18x。所以你可以简单地计算var faktor = -18 * x;
  • 当 x 是 10^33 时,y 应该是 15(看看我的 wolfram 链接),但这显然是另一个结果。我认为我犯了一个巨大的错误,它不是 10^(-18*x),而是 10^(-18)*x,完全不同。我正在调查。
  • 好吧,现在 vanilla javascript 可以处理它了。仍然非常感谢你,你的回答帮助了我寻找我的错误。
【解决方案2】:

您超出了 JavaScript 中允许的最大整数相当多。

Max int in JS

Wolfram proof because why not

您将需要大量的 JavaScript 扩展,SO 有很多关于它的帖子。 See here for what appears to be unlimited integer math

更多这样的帖子可以从here开始追

【讨论】:

  • 所以我必须像这样设置 x:var x = new BigNumber(Math.pow(10,33)); 并像以前一样计算?
  • 您必须使用该库并且该库。如果你尝试做 x * 4 你会得到无穷大。 JavaScript 无法处理,但 BigNumber 扩展和函数集可以。
  • 问题是,bignumber.js 中没有对数函数,我找不到它的库。 :(
  • @AdmiralAdama 问题是下溢,而不是上溢。 -18*Math.pow(10,33) 在 Javascript 中计算得很好,因为它使用浮点表示:-1.8000000000000002e+34
【解决方案3】:

代码

实践价值:

var x = Math.pow(10,33);           // x = 1.0000000000000001e+33
var exponent = -18*x;              // exponent = -1.8000000000000002e+34
var deci = Math.pow(10, exponent); // deci = 0
var logged = Math.log(deci);       // logged = NaN (-Infinity)
var result = logged/Math.log(10);  // result = NaN (-Infinity)

问题在于浮点值的十进制指数可以在 -308 到 +308 范围内(大约,实际上都是二进制),而您的指数大约是 18,000,000,000,000,002,000,000,000,000,000,000。

数学

数学给了我们 log(xy) = y.log(x)。而那个 logb(b) = 1。因此,

   log10(10-18x) = -18x.log(10) = -18x。

所以数学课是“记录 X(以 b 为底)”和“将 b 提高到 X 的幂”是逆运算

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-08-12
    • 2015-03-22
    • 1970-01-01
    • 2019-03-19
    • 1970-01-01
    • 2011-02-02
    • 2011-06-27
    • 1970-01-01
    相关资源
    最近更新 更多