Хенк совершенно прав. Просто чтобы добавить немного к этому.
То, что здесь происходит, заключается в том, что если компилятор генерирует код, который сохраняет операции с плавающей запятой «в микросхеме», то они могут выполняться с более высокой точностью. Если компилятор генерирует код, который перемещает результаты обратно в стек время от времени, то каждый раз, когда он делает это, дополнительная прецессия теряется.
Выбор компилятором кода высокой точности или нет, зависит от всех видов неуточненных деталей: откомпилированы ли вы отладкой или в розничной торговле, работаете ли вы в отладчике или нет, независимо от того, находятся ли числа с плавающей запятой в переменных или константах, какая архитектура чипов у конкретной машины и т. д.
По сути, вам гарантирована 32-битная точность ИЛИ ЛУЧШЕ, но вы НИКОГДА не можете предсказать, улучшите ли вы 32-битную точность или нет. Поэтому вы НЕ ДОЛЖНЫ полагаться на точность в 32 бита, потому что это не гарантия, которую мы вам даем. Иногда мы добиваемся большего успеха, а иногда нет, и если вы иногда получаете лучшие результаты бесплатно, не жалуйтесь на это.
Хенк сказал, что не может найти ссылку на это. Это раздел 4.1.6 спецификации C #, в котором говорится:
Операции с плавающей точкой могут быть
выполняется с большей точностью, чем
тип результата операции. За
Например, некоторые аппаратные архитектуры
поддерживать «расширенный» или «длинный двойной»
тип с плавающей точкой с большим диапазоном
и точность, чем двойной тип,
и неявно выполнять все
операции с плавающей точкой с использованием этого
тип более высокой точности. Только в
может такая перегрузка в производительности
аппаратные архитектуры должны быть сделаны для
выполнять операции с плавающей точкой с
меньше точности, а не
требуют реализации, чтобы потерять
и производительность, и точность, C #
позволяет более высокую точность типа
используется для всех чисел с плавающей точкой
операции. Кроме доставки большего
точные результаты, это редко имеет какой-либо
измеримые эффекты.
Что касается того, что вы должны сделать: во-первых, всегда используйте удвоения. Нет никаких оснований использовать поплавки для арифметики. Используйте поплавки для хранения , если хотите; если у вас есть миллион из них и вы хотите использовать четыре миллиона байтов вместо восьми миллионов байтов, это разумное использование для чисел с плавающей точкой Но он стоит COST во время выполнения, потому что чип оптимизирован для выполнения 64-битной математики, а не 32-битной математики.
Во-вторых, не полагайтесь на точные или воспроизводимые результаты с плавающей запятой. Небольшие изменения в условиях могут привести к небольшим изменениям в результатах.