Предотвращение Ошибок Округления


Я как раз читал об ошибках округления в C++. Итак, если я делаю математическую интенсивную программу (или любые важные вычисления), должен ли я просто отбросить все поплавки вместе и использовать только двойные или есть более простой способ предотвратить ошибки округления?

3 3

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 всегда будет просто перемещать десятичный знак. Если нет, то, возможно, это можно сделать в двоичном коде.

Вам придется применять его после каждой операции, которая не является+, -, * или сравнением. Например, вы не можете сделать два деления в одной формуле, потому что вам придется применить ее к каждое подразделение.

Если это не работает, вы можете работать с целыми числами, масштабируя их и всегда используя целочисленное деление. Если вам нужны расширенные функции, возможно, есть пакет, который делает детерминированную целочисленную математику. Целочисленное деление требуется во многих финансовых установках из-за ошибки округления, подлежащей эксплойту, как в фильме "офис".