Все ли операции с плавающей запятой в системе одинаковы? - PullRequest
4 голосов
/ 14 апреля 2010

Мы создаем это веб-приложение на PHP, и при работе с отчетами у нас есть файлы Excel, чтобы сравнить наши результаты и убедиться, что наше кодирование выполняет правильные операции.

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

Мой вопрос заключается в том, делегирует ли Excel свою арифметику с плавающей запятой процессору, а PHP также полагается на процессор для своих операций. Или каждое приложение реализует свой собственный набор математических алгоритмов?

Ответы [ 4 ]

3 голосов
/ 14 апреля 2010

Microsoft Excel использует собственный тип Double на конкретной машине для выполнения своих расчетов. Я не уверен, что именно PHP использует.

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

Наконец, есть очевидная разница между double, который использует Excel, и (если ваш PHP-код его использует) и float в коде PHP. Убедитесь, что вы не ошиблись, поскольку float s имеют гораздо меньшую точность.

РЕДАКТИРОВАТЬ: забыл об этом тоже - будут различия в выходных данных, если PHP или Excel (более вероятно, Excel) использует / использует расширения SSE, поскольку их операции с плавающей запятой работают на 64-битных, а не 80-битных, удваивается.

1 голос
/ 14 апреля 2010

В большинстве систем реализовано IEEE 754 , что не очень хорошо, но достаточно для большинства целей. Если вы хотите повысить точность, посмотрите на что-то вроде GMP .

0 голосов
/ 14 апреля 2010

Для большей, но не произвольной точности, попробуйте qd .

0 голосов
/ 14 апреля 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...