Какова некоторая хорошая DOS и не делает - s для арифметики с плавающей точкой (IEEE754 в случае, если существует беспорядок) гарантировать хорошую числовую устойчивость и высокую точность в Ваших результатах?
Я знаю, что некоторым нравится, не вычитают количества подобной величины, но мне любопытно, что другие хорошие правила там.
Прежде всего, примите во внимание, что числа с плавающей запятой НЕ обязательно подчиняются тем же правилам, что и вещественные числа... как только вы примете это, вы поймете большинство подводных камней.
Вот несколько правил/советов, которым я всегда следовал:
if (myFloat == 0)
(a + b) + c != a + (b + c)
Правило №1 "не использовать" числа с плавающей точкой:
Не используйте числа с плавающей точкой там, где достаточно целых чисел.
ДЕЙСТВИТЕЛЬНО понимаю, как ведут себя операции с плавающей запятой.
НЕ верьте, что простых правил будет достаточно для их правильного использования.
Например, по крайней мере в двух ответах предлагалось запретить сравнение чисел с плавающей запятой на равенство. Во-первых, есть случаи, когда необходимо их сравнение на предмет равенства. Затем, когда требуется проверка диапазона, вам также необходимо знать, что у нее есть подводный камень, например, она не является транзитивной, что является свойством, которое большинство людей примут для проверки на равенство.
никогда не пытайтесь выполнить сравнение равных
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 исключительно больно и приводит к еще большим ошибкам. К сожалению, таков мир, в котором мы живем на большинстве платформ.
Искать, скачивать и читать «что должен знать каждый компьютерный ученый об арифметике с плавающей запятой»
Мое "главное оружие" для избежания подводных камней с плавающей точкой - это твердое понимание того, как они работают. Я думаю, Крис Хекер довольно хорошо объясняет основы.
Помните, что из-за неправильной арифметики с плавающей запятой погибли люди и был нанесен ущерб на миллиарды долларов .