CW *_* II 6 c++ floating-point constants c++17
C++ 17添加十六进制浮点常量(浮点字面值).为什么?几个显示好处的例子怎么样?
浮点数存储在基数2的x86/x64处理器中,而不是基数10:https://en.wikipedia.org/wiki/Double-precision_floating-point_format.由于许多十进制浮点数不能精确表示,例如十进制0.1可以表示为0.1000000000000003或0.0999999999999997 - 无论基数2表示是否接近十进制0.1.由于这种不精确性,例如以十进制打印然后解析浮点数可能导致与打印之前存储在存储器中的数字略有不同的数字.
对于某些应用程序,此类错误的出现是不可接受的:它们希望解析为与打印前完全相同的二进制浮点数(例如,一个应用程序导出浮点数据和另一个导入).为此,可以以十六进制格式导出和导入双精度数.因为16是2的幂,所以二进制浮点数可以用十六进制格式精确表示.
printf并且scanf已经使用%a格式说明符进行了扩展,该格式说明符允许打印和解析十六进制浮点数.虽然MSVC++还不支持%a格式说明符scanf:
scanf不提供a和A说明符(请参阅printf类型字段字符).
要double以十六进制格式打印全精度,应指定在点之后打印13个十六进制数字,这对应于13*4 = 52位:
double x = 0.1;
printf("%.13a", x);
Run Code Online (Sandbox Code Playgroud)
通过代码和示例查看有关十六进制浮点的更多详细信息(请注意,至少对于MSVC++ 2013中的简单指定%a,printf打印后6位十六进制数字,而不是13 - 这在本文末尾说明).
特别是对于常数,如问题中所要求的,十六进制常量可以方便地在精确的硬编码浮点输入上测试应用程序.例如,您的错误可以重现0.1000000000000003,但不适用于0.0999999999999997,因此您需要十六进制硬编码值来指定十进制0.1的感兴趣表示.
| 归档时间: |
|
| 查看次数: |
1006 次 |
| 最近记录: |