Сегодня утром у меня был небольшой WTF. Это WTF можно суммировать следующим образом:
float x = 0.2f;
float y = 0.1f;
float z = x + y;
assert(z == x + y); //This assert is triggered! (Atleast with visual studio 2008)
Причина, по-видимому, заключается в том, что выражение x + y
удваивается и сравнивается с усеченной версией в z
. (Если я изменю z
на double
, утверждение не сработает).
Я вижу, что по соображениям точности имеет смысл выполнить всю арифметику с плавающей запятой с двойной точностью до преобразования результата в одинарную точность. Я нашел следующий абзац в стандарте (который, я думаю, я уже знал, но не в этом контексте):
4.6.1.
«Значение типа float
может быть преобразовано в значение типа double
. Значение не изменяется»
У меня такой вопрос, гарантированно ли x + y
будет повышен до двойного или по усмотрению компилятора?
ОБНОВЛЕНИЕ: Поскольку многие утверждали, что не следует использовать ==
для плавающей запятой, я просто хотел заявить, что в конкретном случае, с которым я работаю, точное сравнение оправдано .
Сравнение с плавающей запятой - это сложно, вот интересная ссылка на предмет, который, я думаю, не упоминался.