2009-06-18 139 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