Вольфрам альфа и арифметика с плавающей точкой c (потеря значимости) - PullRequest
0 голосов
/ 04 марта 2020

Я изучаю арифметику с плавающей точкой c. Предположим, мы в двойной точности. Мы знаем, что когда мы вычитаем два числа, которые имеют «почти» одинаковую величину, относительная ошибка велика.

Например, в командном окне MatLab, если я вычисляю

2.0000001-2.0

Я получаю 9.99999998363421e-08

и с относительной ошибкой errRel = 1.63657882716964e-09, которая не является незначительной.

Но если я сделаю это в альфа-версии Wolfram ( или с калькулятором моего ноутбука), я на самом деле получаю правильный результат, который 1e-7.

Итак, мой вопрос : почему это так? Я думал, что и MatLab, и калькулятор моего ноутбука использовали арифметику с плавающей запятой c одинаково

1 Ответ

0 голосов
/ 05 марта 2020

Существует две возможные причины, по которым при вычитании 2.0000001-2.0 можно увидеть ровно 1e-7.

Одна из них заключается в том, что многие системы округляют до разумного числа цифр на выходе. Точное преобразование в десятичное число 64-разрядного двоичного кода IEEE 2.0000001-2.0 составляет 9.9999999836342112757847644388675689697265625E-8. Некоторые системы округляют до ограниченного числа значащих цифр и могут печатать это как 1e-7. С другой стороны, Java, например, по умолчанию доставляет достаточно цифр, чтобы отличить guish исходное значение от любого другого двойного, и печатает 9.999999983634211E-8

Другая возможная причина - если арифметика c выполняется в десятичном формате, то в этом случае действительные числа 2.0000001, 2 и их разность все точно представимы, поскольку все они являются десятичными дробями. Вам нужно вычислить что-то вроде 1/3, чтобы увидеть ошибку округления.

...