Как обращаться с точностью в арифметике с плавающей точкой в ​​C - PullRequest
2 голосов
/ 16 сентября 2009

В соревнованиях по программированию вопросы, связанные с арифметикой с плавающей запятой, говорят: «ошибка - ответ должен быть меньше 1e-6» или «ответ должен быть правильным до 6 десятичных знаков». Означает ли это, что я могу выполнять вычисления переменных FP, не беспокоясь о точности, и только во время печати я должен писать как

printf("%.6lf",a);

Я правильно понимаю? И означают ли приведенные выше 2 цитаты одно и то же? В одном из вопросов, когда я использовал двойной массив, выполнил некоторые вычисления и напечатал один из элементов массива. На нем напечатано «-0.000000». Что это значит? Но когда я использовал векторы в C ++, такие как

vector<double> arr(10,0.0);

Те же расчеты напечатаны «0,000000». Почему такая разница?

Ответы [ 6 ]

2 голосов
/ 16 сентября 2009

Точность зависит не только от используемого типа, но и от как вы вычисляете вещи.

Например, вы хотите вычислить это:

1e9 + 1e-9 - 1e9

Правильный ответ должен быть 1e-9, но при выполнении в таком порядке 1e-9 теряется при добавлении к 1e9 и дает 0.

Использование float или double недостаточно, чтобы быть уверенным в получении правильных 6 цифр. Вы должны оценить возможную ошибку на каждом шаге.

Вы должны прочитать о Числовой анализ

2 голосов
/ 16 сентября 2009

Ошибка 1e-06 равна 0,000001, а влияет на 6-е десятичное место, но я думаю, что только педант будет настаивать на том, что между этими двумя кавычками есть разница. (я один, и чтобы узнать один)

Требование о сохранении точности до 6 десятичных разрядов, вероятно, должно напоминать вам, что точность вычисления составляет всего лишь точность наименьшего точного значения, используемого в вычислениях.

Таким образом, вы не можете рассчитать окружность круга до 6 знаков после запятой, если вы использовали 3.1416 в качестве PI, независимо от того, насколько точно вы измерили радиус

2 голосов
/ 16 сентября 2009

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

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

1 голос
/ 16 сентября 2009

Нет способа узнать, достаточно ли float или нужно ли использовать bool или даже более высокую точность; некоторые алгоритмы могут быстро разрушать точность. Например, вычисляя значения путем суммирования асимптотических рядов, вы можете достичь точки, в которой любая слишком низкая точность (будь то 5 или 15 цифр) просто взрывается. Вы можете прочитать о таких вещах, например, в этом блоге .

И в этом сообщении в блоге, почему его "float" (Python float = двойной точности) терпит неудачу, но его собственные собственные процедуры делают это? Его подпрограммы не только могут использовать произвольную точность, но и контролируют вычисления, чтобы добавить точность, когда ошибка возрастает. Только так можно быть уверенным.

1 голос
/ 16 сентября 2009

Арифметический знак с плавающей запятой не является частью числа, поэтому есть и -0, и 0.

0 голосов
/ 16 сентября 2009

Blockquote, означают ли 2 приведенные выше кавычки одно и то же?

Очевидно, нет. 1-e6 говорит, что ваш ответ должен быть в пределах .000001 от правильного. 6 точек точности означают, что 12345678 является правильным, даже если ответ 12345689. Разница намного больше, чем .0000001. Теперь, если ваш ответ .100001 (с правильным ответом .100000), то это одно и то же.

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