Это не будет верно , если x
это NaN
, так как сравнения на NaN
это всегда ложно (да, даже NaN == NaN
). Для всех остальных случаев (нормальные значения, субнормальные значения, бесконечности, нули) это утверждение будет верным.
Рекомендация по избежанию операций с плавающей точкой ==
применима к вычислениям, поскольку числа с плавающей запятой не могут точно выразить многие результаты при использовании в арифметических выражениях. Присвоение не является расчетом, и нет причин, по которым присваивание могло бы дать значение, отличное от исходного.
Оценка расширенной точности не должна быть проблемой при соблюдении стандарта. Из <cfloat>
унаследованного от C [5.2.4.2.2.8] ( выделено мое ):
За исключением присваивания и приведения (которые удаляют весь дополнительный диапазон и точность) , значения операций с плавающими операндами и значениями, подверженными обычным арифметическим преобразованиям и плавающим константам, оцениваются в формате, диапазон и точность которого могут быть больше, чем требуется для тип.
Однако, как отмечалось в комментариях, некоторые случаи с определенными компиляторами, опциями сборки и целями могут сделать это парадоксально ложным.