考虑 0.3 左右的精确浮点值
1) 0.2999999523162841796875
2) 0.2999999821186065673828125
3) 0.300000011920928955078125
4) 0.3000000417232513427734375
5) 0.30000007152557373046875
当我们用C++编写如下代码时
auto x = 0.30f
编译器必须解析 0.30f
标记并使 x 的类型为 float,值为 0.300000011920928955078125
。 (上面的选项 3)
我很好奇编译器是如何达到这个值的,而不是它周围的值。一种理论是他们调用 strtof
函数来获取 float 。 Here是 strtof 的实现(它基本上是遍历字符串的每个字符,乘以 10 的幂并计算出小数点的位置)。我不清楚为什么此方法会给出选项 3 而不是选项 4 或 5。
最佳答案
One theory is that they call strtof function to get the float.
的确;他们使用类似于 strtof
的函数。有开源编译器。你可以看看他们是如何解析文字的。 Here是 GCC 的一个实现。这里复制太大了。它使用 GNU MPFR(多精度浮点)库。
IEEE-754 文档在标题为5.12 float 据与外部字符序列之间转换的详细信息 的部分中指定了此转换必须如何在符合 IEEE-754 的系统上运行。除了转换函数,它还适用于翻译时间转换,例如浮点文字的转换。
关于c++ - 将浮点文字映射到其二进制表示的过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59736602/