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

wfypjpf4  于 2023-04-11  发布在  其他
关注(0)|答案(2)|浏览(135)

此问题已在此处有答案

Why floating-points number's significant numbers is 7 or 6(3个答案)
How to calculate float type precision and does it make sense?(4个答案)
3年前关闭。
FLT_DIG、DBL_DIG、LDBL_DIG分别是可以用float、double和long double类型准确表示的十进制数。

#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节给出了精确的公式-例如对于float,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))

因此,# decimal digits:

= floor(24*log(2)) = 7

而不是floor(23 * log(2)) = 6作为标准状态。

tsm1rwdh

tsm1rwdh1#

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

大致,用p个二进制数,可以编码p*(log 102)个十进制数,每个二进制数贡献约0.3个十进制数。

调用浮点值和数字作为十进制文本,其中n表示数字和指数在更大的 * 对数 * 分布中 * 线性 * 分布。
下面的-1来自最坏情况的对齐问题,其中十进制值的分布相对于二进制值最密集。如果float基数为10,则没有-1,因为分布对齐。

下面是我遵循的推理,这并没有回答这个问题。...
OP的推理路线在here中的#6失败了。十进制值与二进制值的对齐并不总是“有效”。
float为例。
1.在范围[233或8,589,934,592...234或17,179,869,184)中,再次,223(8,388,608)个值被 * 线性 * 编码:在子范围[9,000,000,000和10,000,000,000)中,存在约976,562个不同值。
1.作为文本,范围[9,000,000 *103和10,000,000 *103),使用1个前导数字和6个尾随数字,有1,000,000个不同值。每个#1,在同一范围内,有不到1,000个,000个不同的float值。因此,一些十进制文本值将转换为相同的float在此范围内,我们可以使用6位数,而不是7位数进行特殊转换。

unguejic

unguejic2#

我是这么想的。免责声明:我只是一个程序员,不是数学家,更不用说是一个数论家了,对他们来说,你问的问题形成了(我相信)一个中心定理。
大家都知道基数10:两位数给你102或100个值,三位数给你103或1000个值,等等。
每个程序员都知道base 2:8位提供28或256个值,16位(两个字节)提供216或65536个值,依此类推。
所以问题是,一个十进制数字有多少位?
23是8,所以比3位多。24是16,所以比4位少。
你知道对数,对吗?(你问的公式中有一个,所以我希望你至少知道一点。)对数是指数的逆。如果102是100,那么log 10 100是2。如果28是256,那么log 2 256是8。
因此,十进制数字中的二进制位数是log 2 10,结果大约是3.322。(看,我是对的:大于3,小于4)。
我们也可以用另一种方法。如果216是65536,那么16位对应的十进制数是多少?显然它大约是5:我们需要5位数来写65536。但实际上它必须比5少一点,因为用5个十进制数字我们可以表示大约99999个不同的值,这超过了16位。
事实上,根据我们之前的结果,一个十进制数字中有3.322个二进制位,我们需要16 ÷ 3.322 4.8个十进制数字来精确表示16位。
最后,让我们看看浮点。(通常是C float)具有24位的有效使用我们的转换因子,这相当于24 ÷ 3.322 7.2个十进制数字。(实际上,它比这更复杂一些,由于IEEE-754中的复杂因素,例如非规范化数字和隐式1位,但7.2位数字现在可以作为答案。
我已经稍微误导了你,因为我一直在使用log 210 3.322的转换因子来在二进制位和十进制位之间来回转换,而你引用的公式是log 10 b(对于我们来说,b 可能是2)。他们乘以log 10 b,而我除以log 210。惊喜,惊喜:log 210 == 1 /(log 10 2).(我相信有一个优雅的证明,但这个答案太长了。)

相关问题