从浮子到双精度,从双精度到浮子的精度损失
Precision loss from float to double, and from double to float?
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 实际浮动类型部分:
- 当浮点数提升为双精度或长双精度时,或者双精度 提升为长双倍,其值不变。
- 当双精度 降级为浮动,长双精度降级为双精度或浮动,或 以比所需更高的精度和范围表示值 通过其语义类型(见 6.3.1.8)显式转换为 语义类型,如果正在转换的值可以精确表示 在新类型中,它保持不变。如果要转换的值位于 可以表示但不能表示的值范围 确切地说,结果要么是最近的更高,要么是最近的更低 可表示的值,以实现定义的方式选择。如果 正在转换的值超出了可以 表示,行为未定义
对于C++,来自第 4.6 节,又名 conv.fpprom(使用的草案:n337,我相信最终规范中也有类似的行)
浮点型的 prvalue 可以转换为双精度类型的 prvalue。 该值保持不变。此转换称为浮点数 晋升。
和第 4.8 节又名转换双倍
浮点类型的 prvalue 可以转换为 另一种浮点类型。如果源值可以完全 在目标类型中表示,转换的结果是 确切的表示。如果源值位于两个相邻值之间 目标值,则转换结果为 实现定义的任一值的选择。否则 行为未定义。 允许作为浮点的转换 促销不包括在浮点转换集中
因此,这些值应该完全相等。
相关文章:
- 如何防止 c++ 在从浮点型转换为双精度型(不适用于 IO)时添加额外的小数?
- 正在将csv文件读取为双精度矢量
- 我可以信任表示整数的浮点或双精度来保持精度吗
- 如何在C++中的同一函数中使用字符串和双精度
- 特征::矩阵<双精度,1,3> 结构类型函数中的返回类型函数
- 检查是否以特定精度给出双精度
- 转换函数,将 std::数组的双精度作为参数或双精度作为参数单独转换
- C 字符串返回字符串的整数/双精度/长整型值
- 为什么将双精度转换为 int 似乎在第 16 位数字之后将其四舍五入?
- 如何使双精度值的 C++ 和 C# 中的结果相同
- 添加双精度时精度损失
- 从浮子到双精度,从双精度到浮子的精度损失
- 将字符串转换为双精度,然后将双精度转换为字符串,而不会损失精度
- 处理在减去两个彼此接近的双精度时的精度损失
- 在C++中将双精度转换为字符串时精度损失
- 在C++中标记双精度损失的算法不会标记正确的位置
- 如果可以接受一些精度损失,如何快速紧凑地保存双精度矩阵
- 在 c++ 中将双精度转换为整数损失 1
- 添加双精度时精度损失
- 从 Python 浮点数转换为双精度C++时的精度损失