Математика с одинарной точностью в JavaScript - PullRequest
2 голосов
/ 17 апреля 2019

Я заново внедряю некоторый код C в JavaScript, и для того, чтобы пройти тесты, мне нужно, чтобы код JavaScript возвращал тот же результат, что и код C. Код C имеет дело исключительно с числами с плавающей точкой одинарной точности (в то время как JavaScript number имеет двойную точность).

Например, в C -3.12744117f + 8.60676003f равно 5.47931862f. В JavaScript -3.12744117 + 8.60676003 равно 5.47931886, что отличается (Math.fround возвращает 5.479319095611572, что даже больше).

Я знаю, что результат JavaScript технически "более корректен", но я стремлюсь к согласованности с менее точным C-аналогом.

Есть ли способ применить 32-битные операции в JavaScript? Нужно ли вручную внедрять стандарт IEEE 574 вручную или есть другие способы?

1 Ответ

1 голос
/ 17 апреля 2019

Ваша попытка должна быть плодотворной, если вы должны преобразовать операнды до применения операции;

Math.fround(Math.fround(-3.12744117) + Math.fround(8.60676003))

В качестве альтернативы, массивы с типом JavaScript Float32Array должны быть альтернативным средством.Например;

(new Float32Array([-3.12744117, 8.60676003])).reduce((a, e) => Math.fround(a + e))

Оба метода дают значение 5.479318618774414 , которое эквивалентно ожидаемому ответу C, округленному до восьми знаков после запятой.

...