2009-06-18 48 views
5

我需要从double值指定要打印的字符串的确切长度,但我不想限制输出超出必要。C:通过printf()打印时,双精度可以多长时间()

当用printf()格式化时,一个6位精确双精度的最大长度是多少?

具体而言,我应该给printf("%X.6lg",doubleValue);中的X赋予什么值以确保没有值会被截断?

我需要详细说明长度的原因是我定义了一个MPI派生数据类型,它由大量的double值的字符串表示组成,并且必须知道它们的确切长度以便在MPI之间划分文件区域流程。

我希望这很清楚。预先感谢您的回答。

+0

我不确定你在问什么 - 你想要所有的值都是6位有效数字,比如0.123456,1.23456,12345.6等?或者你只关心小数部分是6位有效数字?至于小数值,我不知道如何避免截断,除非你的值是“二进制的”(即以二进制结尾)并且小于或等于63/64ths。 – 2009-06-19 00:00:25

回答

6

使用printf("%.6g", doubleValue)printf("%.6Lg", doubleValue)

注意,在精度说明离开关闭前导数字(“宽度”),使该值的积分部分的长度没有要求。

另请注意,小写“l”将指定您的值为long int。大写“L”指定一个长双倍值。

另请注意,如果您不希望将其更改为科学记数法(如果它是较短的表示形式),那么您将使用“f”而不是“g”。

查看printf reference here

1

有< float.h>包含许多有用的值,其中DECIMAL_DIG,这是一个长双但是。

同样的文件很可能会告诉你,你的平台上具有精度超过6个位数......

PS:还要注意上述黛咪的回答。他指出你的printf()中存在的各种漏洞使我不知所措。

1

IEEE double的最大指数是1023,所以最大的double将是1 + 1/2 + 1/4 + 1/8 + ... etc * 2^1023。这将约为318个字符,以十进制表示。

为什么不使用“e”格式说明符?

+0

并非所有的平台都使用IEEE双打,这就是为什么标准委员会想出了< float.h > ...... – DevSolar 2009-06-18 14:35:01