赞
踩
慕桂英546537
十六进制解决方案:使用%a。OP想要“具有最大精度的打印(或至少到最重要的十进制)”。一个简单的例子是打印七分之一,如下所示:#include int Digs = DECIMAL_DIG;double OneSeventh = 1.0/7.0;printf("%.*e\n", Digs, OneSeventh);// 1.428571428571428492127e-01但让我们深入挖掘.。数学上,答案是“0.142857 142857 142857.”,但我们使用的是有限精度浮点数。让我们假设IEEE 754双精度二进制..所以OneSeventh = 1.0/7.0结果如下所示。还显示了前面和下面的可表示double浮点数。OneSeventh before = 0.1428571428571428 214571170656199683435261249542236328125OneSeventh
= 0.1428571428571428 49212692681248881854116916656494140625OneSeventh after = 0.1428571428571428 769682682968777953647077083587646484375打印精确性的十进制表示double用途有限。C中有两个宏家族。帮助我们。第一组是显着用十进制字串打印的数字,所以当扫描返回字符串时,我们得到原始浮点数。这里显示的是C规范最小值价值和a样本c11编译器FLT_DECIMAL_DIG 6, 9 (float) (C11)DBL_DECIMAL_DIG 10, 17 (double)
(C11)LDBL_DECIMAL_DIG 10, 21 (long double) (C11)DECIMAL_DIG
10, 21 (widest supported floating type) (C99)第二组是显着数字字符串可以扫描成浮点,然后打印FP,仍然保留相同的字符串表示形式。这里显示的是C规范最小值价值和a样本c11编译器我相信在C99之前就有了。FLT_DIG 6, 6 (float)DBL_DIG 10, 15 (double)LDBL_DIG 10, 18 (long double)第一组宏似乎符合OP的目标显着数字。但那宏并不总是可用的。#ifdef DBL_DECIMAL_DIG #define OP_DBL_Digs (DBL_DECIMAL_DIG)#else
#ifdef DECIMAL_DIG #define OP_DBL_Digs (DECIMAL_DIG)
#else
#define OP_DBL_Digs (DBL_DIG + 3)
#endif#endif“+3”是我先前回答的关键。如果知道往返转换字符串-fp-string(SET#2宏可用C89),那么如何确定fp-string-fp(SET#1宏可用后C89)的数字?总的来说,Add 3就是结果。现在有多少显着要打印的数字是已知的,并通过.打印N显着十进制数字可以使用各种格式。带着"%e",精密度字段是数字的数目。后领头数字和小数点。所以- 1是合乎情理的。注:此-1 is not in the initialINDIG=十进制_DIG;printf("%.*e\n", OP_DBL_Digs - 1, OneSeventh);// 1.4285714285714285e-01带着"%f",精密度字段是数字的数目。后小数点。像这样的数字OneSeventh/1000000.0,一个人需要OP_DBL_Digs + 6去看所有的显着数字。printf("%.*f\n", OP_DBL_Digs , OneSeventh);// 0.14285714285714285printf("%.*f\n", OP_DBL_Digs + 6, OneSeventh/1000000.0);
// 0.00000014285714285714285注:许多人习惯于"%f"..它在小数点之后显示6位数字;6是显示默认值,而不是数字的精度。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。