2016-12-30 6 views
2

浮動小数点数1.2345678,0.1234567,123.45678を最初のn文字だけが出力されるようにprintfで出力しようとしています。私はこれらの数字を整列させたい。 printf( "%* g"、n、var)の%g書式指定子はこれを行いますが、指定子は0.1234567の0を有効数字として扱っていません。これにより、0.1234567のアライメントが他の2つの図に移動しなくなります。printf%gフォーマット指定子の有効数字として0を扱う

与えられた書式で数値を整列する最良の方法は何ですか。 0を重要なものとして%gで扱うか、他の方法を使用していますか?

+0

から始まるよりも良好な初期推測を行うために使用することができ明確にしてください:私はすべての3 – chux

+0

所望の出力の所望の出力の例を投稿シークは、 0.12346 1.23457 123.457として表されます。 ANSI Cと標準のprintf識別子を使用してこの結果を得ることは不可能です。 – OS2

答えて

0

By definition先行ゼロは有効数字ではありません。先行ゼロを含めて最初のN桁を印刷する場合は、最初に数値を文字列に変換し、printf("%.*s", n, var_as_string)を使用します。

この方法では、最初にn文字が表示されます。もちろん、その他の文字と同様に、小数点.は、今度は、%gとは対照的に、重要です。

+0

それは本当です。数字が自動的に切り上げられたり、下げられたりしない(メジャー)脆弱性のみです。 – OS2

+0

@ OS2数値を文字列に変換するために 's(n)printf'を使うと、' printf'と同じ丸めが行われます。 – xhienne

+0

s(n)printfはデータをバッファにコピーします。しかし、丸めを考慮しないprintfを使用して、その文字列の切り捨てられたサブセットを出力しています。何か不足していますか? – OS2

0

ブルートフォース法は、成功するまで%.*gの様々な精度を試行します。

の前にを呼び出すことの最大の障害は、printf()です。コーナーケースは0.9995のように存在します。丸めのわずかな影響により、後でsprintf()に電話するほうが簡単になります。追加のコードではなくprec = n - 1

int g_print(double x, int n) { 
    int width; 
    char buffer[n + 1]; 
    for (int prec = n - 1; prec >= 0; prec--) { 
    width = snprintf(buffer, sizeof buffer, "%.*g", prec, x); 
    // printf(" n:%2d p:%2d w:%2d <%s>\n", n, prec, width, buffer); 
    if (width > 0 && (unsigned) width < sizeof buffer) { 
     return printf("%2d <%s>\n", n, buffer); 
    } 
    } 
    // Try with %f 
    width = snprintf(buffer, sizeof buffer, "%.0f", x); 
    if (width > 0 && (unsigned) width < sizeof buffer) { 
    return printf("%2d <%s>\n", n, buffer); 
    } 
    printf("%2d Fail %e\n", n, x); 
    return 0; // fail 
} 

void g_print_test(double x) { 
    // Need at least width 7 for all values 
    for (int n = 8; n >= 1; n--) { 
    if (g_print(x, n) == 0) 
     break; 
    } 
} 


int main() { 
    g_print_test(1.2345678); 
    g_print_test(0.1234567); 
    g_print_test(123.45678); 
    g_print_test(DBL_MAX); 
    g_print_test(-DBL_MAX); 
    g_print_test(-DBL_MIN); 
    return 0; 
} 

出力

n text... 
8 <1.234568> 
7 <1.23457> 
6 <1.2346> 
5 <1.235> 
4 <1.23> 
3 <1.2> 
2 <1> 
1 <1> 
8 <0.123457> 
7 <0.12346> 
6 <0.1235> 
5 <0.123> 
4 <0.12> 
3 <0.1> 
2 <0> 
1 <0> 
8 <123.4568> 
7 <123.457> 
6 <123.46> 
5 <123.5> 
4 <123> 
3 <123> 
2 Fail 1.234568e+02 
8 <1.8e+308> 
7 <2e+308> 
6 <2e+308> 
5 Fail 1.797693e+308 
8 <-2e+308> 
7 <-2e+308> 
6 Fail -1.797693e+308 
8 <-2e-308> 
7 <-2e-308> 
6 <-0> 
5 <-0> 
4 <-0> 
3 <-0> 
2 <-0> 
1 Fail -2.225074e-308 
+0

これを説明する努力に感謝します。しかし、出力を表現する方法としては複雑すぎる。興味はありません。 – OS2

関連する問題