c语言 - 从浮点数到双精度并返回浮点数(未优化)的强制转换是否保证返回相同的值?


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段:

  1. 有三种真正的浮动类型,分别是浮点型、双精度型和长型双精度浮点型的值集是双精度型值集的子集。

§6.3.1.5(实际浮点类型的转换)第1段:

  1. 当实际浮点类型的值转换为实浮型时,如果正在转换的值可以在新类型中精确表示,则它保持不变。

因为float的值是double值的子集,float的值可以精确地表示为double所以它不变。因此,生成的double具有精确的float表示形式,因此它将原封不动地转换回来。

如前所述,该值不变的事实并不意味着它将比较相等,因为它可能是 NaN。但两者都不是 NaN。

最新更新