从浮子到双精度,从双精度到浮子的精度损失

Precision loss from float to double, and from double to float?

本文关键字:双精度 损失 精度      更新时间:2023-10-16
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的值在两者之间没有变化。

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

  1. 当浮点数提升为双精度或长双精度时,或者双精度 提升为长双倍,其值不变
  2. 当双精度 降级为浮动,长双精度降级为双精度或浮动,或 以比所需更高的精度和范围表示值 通过其语义类型(见 6.3.1.8)显式转换为 语义类型,如果正在转换的值可以精确表示 在新类型中,它保持不变。如果要转换的值位于 可以表示但不能表示的值范围 确切地说,结果要么是最近的更高,要么是最近的更低 可表示的值,以实现定义的方式选择。如果 正在转换的值超出了可以 表示,行为未定义

对于C++,来自第 4.6 节,又名 conv.fpprom(使用的草案:n337,我相信最终规范中也有类似的行)

浮点型的 prvalue 可以转换为双精度类型的 prvalue。 该值保持不变。此转换称为浮点数 晋升。

和第 4.8 节又名转换双倍

浮点类型的 prvalue 可以转换为 另一种浮点类型。如果源值可以完全 在目标类型中表示,转换的结果是 确切的表示。如果源值位于两个相邻值之间 目标值,则转换结果为 实现定义的任一值的选择。否则 行为未定义。 允许作为浮点的转换 促销不包括在浮点转换集中

因此,这些值应该完全相等。