DOS и не Делает - s для арифметики с плавающей точкой?

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

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

13
задан Pops 23 June 2010 в 14:46
поделиться

7 ответов

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

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

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

Правило №1 "не использовать" числа с плавающей точкой:

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

5
ответ дан 1 December 2019 в 21:37
поделиться

ДЕЙСТВИТЕЛЬНО понимаю, как ведут себя операции с плавающей запятой.

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

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

5
ответ дан 1 December 2019 в 21:37
поделиться

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

double da,db;

...

if (da==db) then something.

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

float fa,fb;

...

fa = fb + 1.0;

преобразуем fb в double делаем double add затем преобразуем в single и делаем single equal

Вместо этого

fa = fb + 1.0F.

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

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

fa = fb + 1;

или вместо

fa = fb + 0.3333333F;

сделайте что-то вроде этого (если интересует точность).

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

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

0
ответ дан 1 December 2019 в 21:37
поделиться

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

-1
ответ дан 1 December 2019 в 21:37
поделиться

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

0
ответ дан 1 December 2019 в 21:37
поделиться

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

4
ответ дан 1 December 2019 в 21:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: