2014-10-01 2 views
2

Моя цель состоит в том, чтобы иметь инструмент перевода с центрикой степени/радиан.Совместимость с несколькими браузерами в JavaScript с арифметикой с плавающей запятой

var PI  = 3.1415926535897936; 
var PI_100 = 1.5707963267948968; // PI*0.5; 
var PI_300 = 4.71238898038469; // PI*(1.5); 
var D_PI = 6.283185307179587; // 2*pi 

var centTo = 0.015707963267948967; 

Chrome оценивает следующие выражения, как показано ниже:

PI*2 == D_PI  >>> true 
PI*0.5 = PI_100 >>> true 
PI*1.5 = PI_300 >>> true 

100*centTo == PI_100 >>> true 
300*centTo == PI_300 >>> true 

ли эти выражения всегда true на каждом браузере?

Нужно ли использовать эпсилон при сравнении?

var epsilon = 0.0000001; 
Math.abs(a - b) < epsilon 
+2

Просто интересно, почему вы не использовали 'Math.PI'? –

+1

Я бы посоветовал вам спуститься по маршруту эпсилон сейчас, пока вы не будете совершены, если вы собираетесь делать математику на этом уровне –

+0

@LeshaOgonkov Потому что Math.PI - это 3.141592653589793, и если вы сделали D_PI = 2 * Math.PI, тогда D_PI = = 2 * Math.PI ЛОЖНО !!! Но «мой» PI * 2 == «мои» результаты D_PI верны .... – civiltomain

ответ

3

В стандарте ECMAScript определено «числовое значение» (нет специального целочисленного типа), как «соответствующий 64-разрядной двоичной форме с двойной точностью при значении IEEE 754». Это должно означать, что поведение согласовано между реализациями, поскольку они должны, по крайней мере, эмулировать точную точность этого формата.

С другой стороны, две разные операции в рамках одной и той же реализации могут создавать различные ошибки точности, поэтому в целом точные равенства являются рискованными с любой реализацией с плавающей точкой.

Возможно, было бы лучше использовать значение «эпсилон», возможно, обернув его в библиотечную функцию, назвав что-то вроде Utils.isSufficientlyEqualTo.

6

Нет матер язык программирования это плохая практика, чтобы использовать эквивалентности сравнение с числами с плавающей точкой, если проверка на бесконечность или NaN. Всегда лучше проверить и посмотреть, находится ли значение в пределах некоторого допуска.

Смежные вопросы