Предотвращение ошибок округления - PullRequest
3 голосов
/ 20 июля 2011

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

Ответы [ 3 ]

7 голосов
/ 20 июля 2011

Обязательная лекция: Что должен знать каждый программист об арифметике с плавающей точкой .

Также попробуйте прочитать Стандарт IEEE с плавающей запятой .

Вы всегда будете получать ошибки округления. Если вы не используете бесконечную библиотеку произвольной точности, такую ​​как gmplib . Вы должны решить, действительно ли ваше приложение требует такого рода усилий.

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

Наконец, вы можете использовать float или double, стараясь не делать предположений о значениях, ограничивающих точность представления. Я бы хотел этот плагин Valgrind был реализован (grep для float) ...

1 голос
/ 20 июля 2011

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

0 голосов
/ 31 мая 2018

Это может сработать, если ваше наибольшее число меньше 10 миллиардов, и вы используете двойную точность C ++.

if ( ceil(10000*(x + 0.00001)) > ceil(100000*(x - 0.00001))) { 
    x = ceil(10000*(x + 0.00004)) / 10000; 
}

Это должно позволить отключить как минимум последнюю цифру +/- 9. IЯ предполагаю, что деление на 1000 всегда будет просто сдвинуть десятичное место.Если нет, то, возможно, это можно сделать в двоичном формате.

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

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

...