Float в бинарный код и обратно

Рейтинг: 0Ответов: 1Опубликовано: 21.11.2014

Через РНР генерирую числа и с помошью pack преобразовываю их в бинарный код для последующей записи в файл. Потом, через JavaScript, получаю этот файл и вытаскиваю оттуда массив float чисел, используя формулу:

Math.pow(-1,S) * Math.pow(2,E-Math.pow(2,(b-1))+1) * (1+M/Math.pow(2,n))

где S - первый бит; E - целая часть; M - остаток мантиссы; b и n - количество бит под целую часть и мантиссу.

В результате в РНР получил следующее число - 782.662037.
Получаю файл через JS и "достаю" оттуда мое число, получилось: 783.9998168945312.
И так с многими числами, а точнее с определенными интервалами, например, число 1035,*\*\*\* получается больше, чем 2000,\*\*\*\*.

В чем причина таких непредсказуемых результатов?

Ответы

▲ 1

Прчина в том, что в стандарте IEEE 754 на число выделяется ровно 8 байт(=64 бита), не больше и не меньше. Отсюда и неверные вычисления javascript. http://learn.javascript.ru/number#%D0%BD%D0%B5%D1%82%D0%BE%D1%87%D0%BD%D1%8B%D0%B5-%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F