为什么基数 2 会导致 FLT_DIG != FLT_DECIMAL_DIG?

问题描述 投票:0回答:1

上下文:https://stackoverflow.com/a/39707410/1778275

如果浮点类型使用基数 10 表示,则 LDBL_DIG 和 LDBL_DECIMAL_DIG 将具有相同的值。

问题:为什么基数 2 会导致

FLT_DIG != FLT_DECIMAL_DIG

同样的问题也适用于前缀:

DBL_
LDBL_
FLT16_

c floating-point c11
1个回答
0
投票

这两个定义都代表 IEEE-754 往返要求,一个

*_DECIMAL_DIG
binary → decimal → binary
,另一个
*_DIG
decimal → binary → decimal

例如,使用 GCC 14.1(不要忘记指定

-std=C11
),我们得到以下定义:

FLT_DECIMAL_DIG: 9
DBL_DECIMAL_DIG: 17
LDBL_DECIMAL_DIG: 21

FLT_DIG: 6
DBL_DIG: 15
LDBL_DIG: 18

W. Kahan 教授于 1997 年 10 月 1 日发表了一篇有趣的论文 关于二进制浮点运算 IEEE 标准 754 状态的讲义。在第 4 页上我们读到:

精度被括在一个范围内,以表征二进制和二进制之间转换的准确程度。 必须实现十进制以符合 IEEE 754。例如,“ 6 - 9 ” Sig。 Dec. 对于单身来说意味着, 在没有溢出/下溢的情况下,...

  • 如果是最多 6 sig 的十进制字符串。十二月 转换为 Single,然后转换回 相同数量的签名。 dec.,那么最终的字符串应该与原始字符串匹配。 另外,...

  • 如果单精度浮点数转换为至少 9 sig 的十进制字符串。 十二月 然后再转回Single,那么最终的数字一定要和原来的一致。 大多数支持片上浮点的微处理器,以及所有服务于著名工作站的微处理器,

© www.soinside.com 2019 - 2024. All rights reserved.