【问题标题】:How to get the finest possible precision in JavaScript?如何在 JavaScript 中获得尽可能高的精度?
【发布时间】:2017-07-09 06:09:54
【问题描述】:

我正在尝试确定 JavaScript 数字中可用于加法和减法的最小可能非负非零值。如有必要,则每个给定值的加法和减法的最小可能数字(即,如果“最小值”在给定范围内的数字之间不同,我想找到给定数字或数字范围的最小值,或者下一个大于或小于给定数字的数字也可以。)

作为强调我为什么要查找此内容的示例,请参阅this fiddle 或下面的代码。它只是按区域缩放一个矩形,给定起始宽度/高度和结束宽度/高度,值应该是整数。对于给定的示例,它的工作原理如下所述,但是我相当确定0.000000000000002 的软糖因子不会扩展到任何可能的值集。我知道绝大多数可能值的浮点范围内的解决方案都不是整数,而且许多解决方案甚至可能超出 JavaScript 数字的精度级别,或者根本无法在其中表示,但是鉴于下面的检查大于或小于基于比率和/或面积我非常有信心,如果我能找到结果可以抵消的最小可能值,我至少可以达到给定输入计算上最准确的数字,这将是这里的目标。

console.clear();
var w = 3;
var h = 5;
var a = w * h;
var r = w / h;
console.log(w, h, a, r);
var t = 240;
var w2 = Math.sqrt(t);
var h2 = w2;
w2 = w2 * r / Math.sqrt(r);
h2 = h2 / r * Math.sqrt(r);
var r2 = w2 / h2;
var m = 10;
var a2 = w2 * h2;
console.log(w2, h2, a2, r2);
while ((r2 > r) && (m > 0)) {
    h2 += 0.000000000000002;
    r2 = w2 / h2;
    m--;
}
m = 10;
while ((r2 < r) && (m > 0)) {
    h2 -= 0.000000000000002;
    r2 = w2 / h2;
    m--;
}
var a2 = w2 * h2;
console.log(w2, h2, a2, r2);

输出:

Console was cleared
3 5 15 0.6
12 20.000000000000004 240.00000000000006 0.5999999999999999
12 20 240 0.6

【问题讨论】:

标签: javascript floating-point numbers precision


【解决方案1】:

可以用多种方式解释可能的最小数字。为了对其他人有用,我将发布有关所有三种解释的信息,尽管我相信您正在寻找第一种:

如果您的意思是精度 - 最接近零的最小可能数字:

Number.MIN_VALUE

会给你:5e-324

如果您的意思是可能的最小浮点数,包括负数,那么您会寻找:

- Number.MAX_VALUE

注意那里的减号。那会给你:-1.7976931348623157e+308

而第三种解释是1与大于1的最小浮点数之差,也称为Machine Epsilon,在这种情况下可以使用:

Number.EPSILON

哪个会给你:-2.220446049250313e-16

最后一点,如果您在支持不同浮点存储方案的 CPU(例如 32 位 CPU)上运行,这些示例可能不准确。

【讨论】:

  • @CoryG 晚了一年半,但希望对其他人有用,因为它对我有用。
猜你喜欢
  • 2016-03-05
  • 1970-01-01
  • 2021-02-19
  • 2023-03-08
  • 2019-09-04
  • 1970-01-01
  • 1970-01-01
  • 2013-02-15
  • 1970-01-01
相关资源
最近更新 更多