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 ?
编辑:评论员提出了一个很好的观点,如果is_nan(x),x!=x_float。但是,应该保证is_nan(x) == is_nan(x_float)?
是的,这是有保证的。
§6.2.5(类型)第10段:
- 有三种真正的浮动类型,分别是浮点型、双精度型和长型双精度型。浮点型的值集是双精度型值集的子集。
§6.3.1.5(实际浮点类型的转换)第1段:
- 当实际浮点类型的值转换为实浮型时,如果正在转换的值可以在新类型中精确表示,则它保持不变。
因为float
的值是double
值的子集,float
的值可以精确地表示为double
所以它不变。因此,生成的double
具有精确的float
表示形式,因此它将原封不动地转换回来。
如前所述,该值不变的事实并不意味着它将比较相等,因为它可能是 NaN。但两者都不是 NaN。