提问人:Valeria Suarez 提问时间:10/25/2023 最后编辑:Fe2O3Valeria Suarez 更新时间:10/25/2023 访问量:69
在 C 中打印双浮点数时,是否有定义非有效数字限制的宏?
Is there a macro that defines the limit of non-significant digits when printing a double floating point number in C?
问:
当使用具有大精度和双浮点数的 printf 时,在非有效数字上会发生舍入(当尾随 0 开始时)。我想知道是否有定义位数限制/数量的宏。
#include <stdio.h>
#include <float.h>
int main() {
const double x = 2.0 / 3.0;
int precision = 100;
printf("%.*f\n", precision, x);
printf("%d\n", DBL_DECIMAL_DIG);
return 0;
}
输出为:
0.6666666666666666296592325124947819858789443969726562500000000000000000000000000000000000000000000000
17
重复的 6 是有效数字,而后面的数字是非有效数字,然后在某个点四舍五入(这个点在哪里定义?),然后是重复的 0。
答:
1赞
Jonathan Leffler
10/25/2023
#1
参见 C11 §5.2.4.2.2 浮动类型的特征 <float.h>
。您可能正在寻找 .请注意,标准中显示的数字是可接受的最小值 - 您的实现可能具有更高的值。DBL_DECIMAL_DIG
十进制位数 n,使得任何具有 p 基数 b 位数的浮点数都可以四舍五入为具有 n 个十进制数字的浮点数,然后再次返回,而无需更改值,
{ p log10 b if b is a power of 10 { { [^1 + p log10 b^] otherwise
FLT_DECIMAL_DIG 6
DBL_DECIMAL_DIG 10
LDBL_DECIMAL_DIG 10
这可能不完全是你所追求的,但它是标准中最接近的近似值。
评论
0赞
Valeria Suarez
10/25/2023
就我而言,DBL_DECIMAL_DIG返回 17,但我发布的数字中有超过 17 位数字。在此之后的一段时间内,它被四舍五入,我正在尝试理解这种行为。
0赞
Jonathan Leffler
10/25/2023
只有 17 位数字可靠;在那之后,你正在处理噪音。查看我链接到的标准部分。可能还有其他事情告诉你你想知道。
评论
FLT_RADIX
DBL_MANT_DIG