JavaScript Epsilon при умножении

1

Я думал, что равенство в ES6 является закрытым случаем, как этот базовый пример:

x = 0.2;
y = 0.3;
z = 0.1;
equal = (Math.abs(x - (y - z)) < Number.EPSILON); // true
console.log(equal)

Но в этом (умножающем) случае это не работает:

x = 2.3;
y = 23;
z = 0.1;
equal = (Math.abs(x - (y * z))) < Number.EPSILON; // false
console.log(equal)

Думаю ли я неправильно? Он предназначен только для операций с плюсом и минусом? Как я могу с уверенностью исправить это (это правда, когда вы несколько epsilon на что-то большее, чем 2)?

  • 0
    (Math.abs(x - (y * z))) = 4.440892098500626e-16 = 2*Number.EPSILON
Теги:
numbers

1 ответ

1

Попробуйте напечатать значение Math.abs(x - (y * z)) и EPSILON:

x = 2.3;
y = 23;
z = 0.1;
equal = (Math.abs(x - (y * z))) < Number.EPSILON; // false
console.log(equal)
console.log(Math.abs(x - (y * z)))
console.log(Number.EPSILON)
console.log(Math.abs(x - (y * z)) == 2*Number.EPSILON)

Чтобы этого избежать, вы должны проверить порядок разницы и сравнить его с EPSILON вместо сравнения фактического значения:

x = 2.3;
y = 23;
z = 0.1;
equal = (Math.abs(x - (y * z)))/ Number.EPSILON < 10;

console.log(equal)
  • 0
    Почему <10? Это магическое число?
  • 0
    потому что именно это определяет порядок, т. е. EPSILON равен 10^(-16) а 10 означает, что порядок меняется, т. е. если он больше 10 то теперь порядок равен 10^(-15)
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню