setpercision
),并且以固定表示法输出(例如使用fixed
),则需要多大的缓冲区才能保证浮点数的整个小数部分都可以存储在缓冲区中?我希望标准库中有一些东西,例如
#define
或numeric_limits
中的某些内容,可以告诉我浮点类型的小数部分的最大十进制值位数。我在这里询问了浮点数类型整数部分的最大基数10位数:What Are the Maximum Number of Base-10 Digits in the Integral Part of a Floating Point Number 但我意识到这可能更加复杂。例如,
1.0 / 3.0
是一个无限重复的数字序列。当我使用fixed
格式输出它时,在重复0之前得到这么多位数:
但我不能确定这是最大精度,因为我不知道这些尾随的0实际上在浮点数的分数中表示了多少,并且它还没有通过负指数向下移动。0.333333333333333314829616256247390992939472198486328125
我知道我们有
min_exponent10
,这是我应该寻找的吗?
2^-100
在十进制下有100个非零数字,并且可以精确地表示为double
。 - alexeykuzmin0double
),DBL_MANT_DIG - DBL_MIN_EXP
(假设FLT_RADIX
为2
)。对于IEEE 754二进制64位浮点数,这给出了一个值为1074
。对于该格式,小数点后的1074
个数字既是必要的,也足以表示任何double
的精确值。(5e-324
是一个例子,其中最后一个非零有效数字在10^{-1074}
位置上。) - Mark Dickinsonnumeric_limits::min_exponent10 + numeric_limits::digits10
,但这个公式可能会有1或2的偏差;我现在没有时间进行全面分析。你可以用numeric_limits::min
进行测试,它将具有最大数量的前导零和精度数字。numeric_limits::lowest
应该有更多的前导零,但只有一位数字的精度。 - Mark Ransom