保持浮点值精度的Printf宽度说明符

保持浮点值精度的Printf宽度说明符

有没有printf宽度说明符,可应用于浮点说明符,该说明符将自动将输出格式化为所需的有效数字这样,当扫描返回字符串时,获取原始浮点值?

例如,假设我打印一个float精确到2小数位:

float foobar = 0.9375;printf("%.2f", foobar);    // prints out 0.94

当我扫描输出时0.94,我没有符合标准的保证,我会得到原来的0.9375浮点值返回(在本例中,我可能不会)。

我想找个方法告诉你printf将浮点值自动打印到所需的有效数字以确保可以将其扫描回传递给printf.

我可以使用一些宏float.h求出最大宽度传给printf,但是是否已经有一个说明符可以自动打印到所需的有效数字-或者至少达到最大宽度?


开心每一天1111
浏览 775回答 3
3回答

慕桂英546537

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

PIPIONE

不丢失地打印浮点数的简短答案(因此可以将它们读回完全相同的数字,但NaN和Infinity除外):如果您的类型是浮动的:使用printf("%.9g", number).如果您的类型是双重的:使用printf("%.17g", number).不使用%f,因为这仅指定小数之后的有效位数,并将截断小数字。作为参考,魔幻数字9和17可以在float.h它定义了FLT_DECIMAL_DIG和DBL_DECIMAL_DIG.

ITMISS

如果您只对位(resp十六进制模式)感兴趣,则可以使用%a格式。这保证你:如果存在基2中的精确表示,并且在其他情况下足够大,足以区分类型Double的值,则默认精度就足以表示值的精确表示。我必须补充一点,这是只有在C99之后才能使用的。
打开App,查看更多内容
随时随地看视频慕课网APP