精确损失从浮动到双重,从双重到浮动?

float fv = orginal_value; // original_value may be any float value ... double dv = (double)fv; ... fv = (float)dv; 

应该fv完全等于original_value吗? 任何精度都可能丢失?

应该fv完全等于original_value吗? 任何精度都可能丢失?

是的,如果dv的值之间没有变化。

从部分转换6.3.1.5 C99规范中的实数浮动类型

  1. 当float被提升为double或long double,或者double被提升为long double时, 其值不变
  2. 当double被降级为float时,long double被降级为double或float,或者以更高的精度和范围表示的值比其语义类型所需的值(见6.3.1.8)被显式转换为其语义类型, 如果被转换的值可以在新类型中准确表示 ,它是不变的。 如果转换的值在可以表示但不能精确表示的值的范围内,则结果是以实现定义的方式选择的最接近的较高或最接近的较低可表示值。 如果要转换的值超出可以表示的值范围,则行为未定义

对于C ++,请参见4.6节,即conv.fpprom (使用的草稿: n337 ,我相信最终规格中提供类似的行)

float类型的prvalue可以转换为double类型的prvalue。 该值保持不变 。 此转换称为浮点提升。

4.8节又称conv.double

浮点类型的prvalue可以转换为另一个浮点类型的prvalue。 如果源值可以在目标类型中准确表示,则转换的结果就是精确表示。 如果源值在两个相邻目标值之间,则转换结果是这些值中任一个的实现定义选择。 否则,行为未定义。 浮点促销中允许的转化从浮点转化集中排除

所以这些值应该完全相等。