Поплавок дополнения повышен в два раза?
У меня был небольшой момент 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
гарантированно будет повышен до двойного или по усмотрению компилятора?
ОБНОВИТЬ: Поскольку многие люди утверждают, что не следует использовать==
для плавающей запятой я просто хотел заявить, что в конкретном случае, с которым я работаю, точное сравнение оправдано.
Сравнение с плавающей точкойявляется хитрый, вот интересныйссылка на предмет, который я думаю, не был упомянут.