c++ - 将浮点文字映射到其二进制表示的过程

标签 c++ floating-point ieee-754

考虑 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/

相关文章:

c++ - 在 V8 中,为什么 Isolate::GetCurrent() 返回 NULL?

java - 如果 Java 的 parseInt 对于有效的 IEEE-754 二进制文件失败,那么哪个 API 不会失败?

javascript - javascript中,按位或运算时是否使用iee-754作为存储格式?

Ruby 将 64 位 IEEE 754 十六进制转换为 double

c++ - boost::program_options:如何在没有 "--"或 "-"的情况下指定命令

c++ - 无法在Qt中调用静态方法

c++ - 共享内存中彼得森锁的问题

c - -funsafe-math-optimizations 中包含哪些优化?

c - IEEE 754 和浮点精度

c++ - IEEE754 float 在多大程度上满足 LessThanComparable?