gpt4 book ai didi

c++ - 为什么在 C++17 中使用十六进制浮点常量?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:20:56 26 4
gpt4 key购买 nike

C++17 添加十六进制浮点常量 ( floating point literal )。为什么?举几个例子来说明好处如何。

最佳答案

float 以 2 为基数存储在 x86/x64 处理器中,而不是以 10 为基数:https://en.wikipedia.org/wiki/Double-precision_floating-point_format .由于无法准确表示许多十进制 float ,例如十进制 0.1 可以表示为 0.1000000000000003 或 0.0999999999999997 - 任何具有足够接近十进制 0.1 的基数 2 表示形式。由于这种不精确性,例如以十进制打印然后解析 float 可能会导致与打印前以二进制方式存储在内存中的数字略有不同。

对于某些应用程序来说,出现此类错误是 Not Acceptable :它们希望解析为与打印前的二进制 float 完全相同的二进制 float (例如,一个应用程序导出 float 据而另一个应用程序导入)。为此,可以以十六进制格式导出和导入 double 。因为 16 是 2 的幂,二进制 float 可以精确地用十六进制表示。

printfscanf 已使用 %a 格式说明符进行扩展,允许打印和解析十六进制 float 。虽然 MSVC++ does not support %a format specifier for scanf然而:

The a and A specifiers (see printf Type Field Characters) are not available with scanf.

要以十六进制格式以全精度打印 double,应指定在点后打印 13 个十六进制数字,对应于 13*4=52 位:

double x = 0.1;
printf("%.13a", x);

查看更多详情 hexadecimal floating point with code and examples (请注意,至少对于 MSVC++ 2013 而言,printf%a 的简单规范会在点后打印 6 个十六进制数字,而不是 13 - 这在文章末尾有说明)。

特别是常量,如问题中所问,十六进制常量可能便于在精确的硬编码浮点输入上测试应用程序。例如。您的错误可能可重现为 0.1000000000000003,但不能重现为 0.0999999999999997,因此您需要十六进制硬编码值来指定十进制 0.1 的兴趣表示。

关于c++ - 为什么在 C++17 中使用十六进制浮点常量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36348234/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com