Гарантируется ли приведение от float к double и обратно к float (это не оптимизировано) вернуть одно и то же значение? - PullRequest
0 голосов
/ 03 мая 2020
float x=something();             // set by something that returns float
double x_double = x;             // cast to double
// Assume no optimization can happen across this barrier
float x_float = x_double;        // cast to float

Гарантируется ли, что x == x_float?

EDIT: комментатор подчеркивает, что x! = X_float, если is_nan (x). Однако следует гарантировать, что is_nan (x) == is_nan (x_float)?

1 Ответ

4 голосов
/ 03 мая 2020

Да, это гарантировано.

§6.2.5 (Типы) пункт 10:

Существует три реальных плавающих типа, обозначенных как float , double и long double . Набор значений типа float является подмножеством набора значений типа double

§6.3.1.5 ( Преобразования вещественных плавающих типов) пункт 1:

  1. Когда значение реального плавающего типа преобразуется в реальный плавающий тип, если преобразуемое значение может быть точно представлено в новом типе, оно не изменяется.

Поскольку значения float являются подмножеством значений double, значение float может быть представлено в точности как double так что без изменений. Таким образом, результирующее double имеет точное представление float, поэтому оно будет преобразовано обратно без изменений.

Как уже было отмечено, тот факт, что значение не изменилось, не означает, что оно будет сравниваться равным, поскольку оно может быть NaN. Но оба или ни один не будет NaN.

...