A RetroSearch Logo

Home - News ( United States | United Kingdom | Italy | Germany ) - Football scores

Search Query:

Showing content from https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Number/EPSILON below:

Number.EPSILON - JavaScript | MDN

10 進数や 2 進数など、どのような基数を選んでも、有限のビット数を占める数字エンコーディングシステムは、必然的にすべての数字を正確に表すことができません。なぜなら、有限のメモリーを使用して、数直線上の無限の点を表現しようとすることになるからです。例えば、10 進法では 1/3 を正確に表せませんし、2 進法では 0.1を正確に表せません。したがって、例えば、0.1 + 0.2 は 0.3 と正確に等しくはなりません。

console.log(0.1 + 0.2); // 0.30000000000000004
console.log(0.1 + 0.2 === 0.3); // false

このため、浮動小数点数で === と比較してはいけないというアドバイスがたくさんあります。その代わりに、異なる 2 種類の数値が十分に近い場合には、等しいとみなすことができます。EPSILONは、要するに 1 という数字がどの程度正確かを指定するものなので、演算結果が 1 程度の大きさであれば、通常 Number.EPSILON 定数がエラーに対する妥当な閾値となります。

function equal(x, y) {
  return Math.abs(x - y) < Number.EPSILON;
}

const x = 0.2;
const y = 0.3;
const z = 0.1;
console.log(equal(x + z, y)); // true

しかし、Number.EPSILON は、それ以上の大きさの演算処理を行う場合には不適切です。もしデータが 103 程度の大きさであれば、小数点以下の部分は Number.EPSILON よりもずっと小さな精度を持つことになります。

function equal(x, y) {
  return Math.abs(x - y) < Number.EPSILON;
}

const x = 1000.1;
const y = 1000.2;
const z = 2000.3;
console.log(x + y); // 2000.3000000000002; error of 10^-13 instead of 10^-16
console.log(equal(x + y, z)); // false

この場合、より大きな公差が必要となります。比較する数値の大きさはおよそ 2000 であるので、2000 * Number.EPSILON のような乗数で、この例では十分な許容範囲を作ることができます。

function equal(x, y, tolerance = Number.EPSILON) {
  return Math.abs(x - y) < tolerance;
}

const x = 1000.1;
const y = 1000.2;
const z = 2000.3;
console.log(equal(x + y, z, 2000 * Number.EPSILON)); // true

大きさだけでなく、入力の精度も考慮することが重要です。例えば、数値がフォーム入力から収集され、入力値が 0.1 のステップでしか調整できない場合(すなわち <input type="number" step="0.1">)、データは 0.1 の精度しかないので通常は 0.01 など、はるかに大きな許容差を認めることを意味します。

メモ: 有益な教訓:等値検査の閾値として、単純に Number.EPSILON を使用しないでくださ い。比較する数値の大きさや精度に適した閾値を使用してください。


RetroSearch is an open source project built by @garambo | Open a GitHub Issue

Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo

HTML: 3.2 | Encoding: UTF-8 | Version: 0.7.4