如何在C中确定FLT_DIG,DBL_DIG和LDBL_DIG [重复]

问题描述 投票:2回答:2

[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;
}

打印61518。该标准在第5.2.4.2.2节中给出了准确的公式-例如对于浮点数,p = 24,b = 2:

enter image description here

但是我不清楚上面的公式(“否则”)是如何得出的。有人可以解释吗?

以下是我遵循的未能回答问题的理由。考虑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作为标准状态。

c floating-point precision floating-accuracy
2个回答
0
投票

这是我的想法。免责声明:我只是一个程序员,而不是数学家,更不用说数字理论家了,您要问的问题构成了我的中心定理。

每个人都知道以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)。 (我敢肯定有一个很好的证明,但是这个答案太长了。)

0
投票

如何确定FLT_DIG,DBL_DIG和LDBL_DIG(?)

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