[FLT_DIG,DBL_DIG,LDBL_DIG是分别可以用浮点,双精度和长双精度类型准确表示的小数位数。
#include <stdio.h>
#include <float.h>
int main(void)
{
printf("%d, %d, %d\n", FLT_DIG, DBL_DIG, LDBL_DIG);
return 0;
}
打印6
,15
和18
。该标准在第5.2.4.2.2节中给出了准确的公式-例如对于浮点数,p = 24,b = 2:
但是我不清楚上面的公式(“否则”)是如何得出的。有人可以解释吗?
以下是我遵循的未能回答问题的理由。考虑float类型,其有效位数为23位(IEEE-754标准)。可以准确表示的最大二进制整数为:
100...00 (25 digits total, because we have an implicit 1)
= 2^24
= 10^(24*log(2))
因此#个十进制数字:
= floor(24*log(2)) = 7
而不是floor(23 * log(2)) = 6
作为标准状态。
这是我的想法。免责声明:我只是一个程序员,而不是数学家,更不用说数字理论家了,您要问的问题构成了我的中心定理。
每个人都知道以10为基数:两位数字为您提供10 2
或100个值,三位数为您提供10 3或1000个值,等等。每个程序员都知道以10为基数:8位为您提供2 8
或256个值,16位(两个字节)为您提供2 16或65536个值,等等。所以问题是,十进制数字中有多少位?
Well,2 3
是8,所以超过3位。 2 4为16,因此小于4位。您知道对数,对吗? (您询问的公式中有一个,因此我希望您至少对它们有所了解。)对数是幂的倒数。如果10 2
为100,则log 10 100为2。如果2 8为256,则log 2 256为8。因此,十进制数字中的二进制位数是log 2
10,结果约为3.322。 (看,我是对的:大于3,小于4。)我们也可以采用其他方式。如果2 16
是65536,则16位对应多少个十进制数字?显然,它大约是5:我们需要5位数字才能写65536。但是实际上它必须小于5,因为使用5个小数位,我们最多可以表示99999个不同的值,即16位以上。事实上,根据我们先前的结果,十进制数字中有3.322个二进制位,我们需要类似16÷3.322&ape; 4.8个十进制数字精确地表示16位。
最后,让我们看一下浮点数。根据Wikipedia的说法,IEEE 754 single-precision floating-point format(通常为C float
)具有24位有效值(又称“尾数”)。使用我们方便的转换因子,它等于24÷3.322&ape; 7.2个十进制数字。 (实际上,由于IEEE-754中的复杂因素,例如非规范化的数字和隐式的1位,实际上比这要复杂得多,但是现在可以用7.2位作为答案。)
我已经让您稍微误入歧途,因为我一直在使用log 2
10&ape; 3.322在二进制位和十进制数字之间来回移动,而您引用的公式为log 10 b(对于我们来说,b可能为2)。另外,请看:它们正在乘以log 10 b,而我一直在除以log 2 10。惊喜,惊喜:log 2 10 == 1 /(log 10 2)。 (我敢肯定有一个很好的证明,但是这个答案太长了。)如何确定FLT_DIG,DBL_DIG和LDBL_DIG(?)