Предотвращение Ошибок Округления
Я как раз читал об ошибках округления в C++. Итак, если я делаю математическую интенсивную программу (или любые важные вычисления), должен ли я просто отбросить все поплавки вместе и использовать только двойные или есть более простой способ предотвратить ошибки округления?
3 ответа:
Обязательная Лекция: что каждый программист должен знать об арифметике с плавающей запятой.
Также попробуйте прочитать стандарт IEEE с плавающей запятой.
Вы всегда будете получать ошибки округления. Если вы используете
бесконечнопроизвольной точности библиотеки, как gmplib. Вы должны решить, действительно ли ваше приложение нуждается в такого рода усилиях.Или, вы можете использовать целочисленную арифметику, преобразуя в плавающие только тогда, когда это необходимо. Это все еще трудно сделать, вы должны решить, стоит ли это того.
Наконец, вы можете использоватьfloat
илиdouble
, стараясь не делать предположений о значениях на пределе точности представления. Я бы хотел, чтобы Этот плагин Valgrind был реализован (grep для float)...
Ошибки округления обычно очень незначительны, даже при использовании поплавков. Математически насыщенные программы, такие как игры, которые выполняют очень большое количество вычислений с плавающей запятой, часто все еще используют единственную точность.
Это может сработать, если ваше наибольшее число меньше 10 миллиардов и вы используете c++ double precision.
if ( ceil(10000*(x + 0.00001)) > ceil(100000*(x - 0.00001))) { x = ceil(10000*(x + 0.00004)) / 10000; }
Это должно позволить по крайней мере последней цифре быть выкл +/- 9. Я предполагаю, что деление на 1000 всегда будет просто перемещать десятичный знак. Если нет, то, возможно, это можно сделать в двоичном коде.
Вам придется применять его после каждой операции, которая не является+, -, * или сравнением. Например, вы не можете сделать два деления в одной формуле, потому что вам придется применить ее к каждое подразделение.
Если это не работает, вы можете работать с целыми числами, масштабируя их и всегда используя целочисленное деление. Если вам нужны расширенные функции, возможно, есть пакет, который делает детерминированную целочисленную математику. Целочисленное деление требуется во многих финансовых установках из-за ошибки округления, подлежащей эксплойту, как в фильме "офис".