Поплавок дополнения повышен в два раза?

У меня был небольшой момент 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 гарантированно будет повышен до двойного или по усмотрению компилятора?

ОБНОВИТЬ: Поскольку многие люди утверждают, что не следует использовать== для плавающей запятой я просто хотел заявить, что в конкретном случае, с которым я работаю, точное сравнение оправдано.

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

Ответы на вопрос(7)

Ваш ответ на вопрос