Do-s и Not-s для арифметики с плавающей точкой? - PullRequest
13 голосов
/ 23 июня 2010

Каковы хорошие и слабые стороны для арифметики с плавающей запятой (IEEE754 в случае путаницы), чтобы обеспечить хорошую числовую стабильность и высокую точность в ваших результатах?

Я знаю несколько подобныхне вычитайте количества одинаковой величины, но мне любопытно, какие еще хорошие правила существуют.

Ответы [ 7 ]

12 голосов
/ 23 июня 2010

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

Вот несколько правил / советов, которым я всегда следовал:

  • НИКОГДА не сравнивайте число с плавающей запятой с нулем или чем-либо еще в этом отношении (IE не делает: if (myFloat == 0)
  • Ассоциативное свойство не выполняется для плавающей запятой ... значение (a + b) + c != a + (b + c)
  • Помните, что всегда есть округление
  • Числа с плавающей запятой не обязательно имеют уникальный обратный
  • Нет замыкания с числами с плавающей запятой ... никогда не предполагайте, что результат операции с плавающей запятой приводит к действительному числу с плавающей запятой.
  • Распределительное свойство не содержит
  • Старайтесь вообще не использовать сравнения с плавающей запятой ... поскольку ошибка округления может привести к неожиданным результатам
5 голосов
/ 23 июня 2010

Понимаю, как ведут себя числа с плавающей запятой.

Не верю, что для их правильного использования будет достаточно простых правил.

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

5 голосов
/ 23 июня 2010

Правило № 1 «не» с числами с плавающей запятой:

Не используйте числа с плавающей запятой там, где будет достаточно целых чисел.

3 голосов
/ 23 июня 2010

Помните, что из-за неверной арифметики с плавающей запятой человек погибли и миллиард долларов ущерба .

0 голосов
/ 25 июня 2010

Мое «главное оружие» для избежания ловушек с плавающей запятой - иметь твердое представление о том, как они работают.Я думаю Крис Хекер довольно хорошо объясняет основы.

0 голосов
/ 23 июня 2010

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

0 голосов
/ 23 июня 2010

никогда не пытайтесь сделать сравнение равных

double da, db;

...

if (da == db) тогда что-то.

помните, что C использует double по умолчанию, поэтому, если вы хотите сделать одинарную точность, помните об этом

float fa, fb;

...

fa =fb + 1.0;

конвертирует fb в double, делает двойное добавление, затем конвертирует в single и делает одинаковое

Вместо

fa = fb + 1.0F.

все одинарные.

Если вы собираетесь использовать целое число, например 1,0, не делайте его десятичным в своем коде.вы получите больше надежности от своих компиляторов / инструментов, если сможете минимизировать числа ascii.поэтому

fa = fb + 1;

или вместо

fa = fb + 0.3333333F;

сделать что-то подобное (если интересует точность).

fc = 1;fc = fc / 3;fa = fb + fc;

Много и много других, плавающая точка болезненна, компиляторы и библиотеки не так хороши, fpus имеет ошибки, а IEEE исключительно болезнен и приводит к большему количеству ошибок.К сожалению, это мир, в котором мы живем на большинстве платформ.

...