2016-07-29 10 views
3

私は次のコードをMacで試しましたが、出力は私には奇妙なものです。値と変数の間のC++の異なる印刷動作

float a = 2.225; 
float b = 123.235; 
printf("round: %.2f %.2f \n", a, b); 
printf("round: %.2f %.2f \n", 2.225, 123.235); 

出力:

round: 2.22 123.24 
round: 2.23 123.23 

グラム++ --version

Configured with: --prefix=/Library/Developer/CommandLineTools/usr --with-gxx-include-dir=/usr/include/c++/4.2.1 
Apple LLVM version 7.3.0 (clang-703.0.31) 
Target: x86_64-apple-darwin15.5.0 
Thread model: posix 
InstalledDir: /Library/Developer/CommandLineTools/usr/bin 

印刷で丸めルールは何ですか?どのように私はこれらの2つの状況で同じ印刷結果を得ることができますか? 多くのありがとうございます。

+10

私は違いが 'float'と' double'sの間にあると思います。 –

+0

Read http://floating-point-gui.de/ –

+2

問題は印刷ではありません。異なる入力を渡すので、異なる出力が得られます。最初のケースでは、 'double'値を' float'変数に代入すると精度が失われます。 –

答えて

6

最初のprintf()は、floatの値をdoubleに変換し、結果を出力します。初期化によってdoubleの定数はfloatに変換されます。 2番目の値はdoubleの値を直接渡します。接尾辞がFfloatの定数を指定できますが、デフォルトの引数昇格規則のために実際にprintf()を呼び出す前に、これらの定数をの定数に変換してdoubleに変換します。

#include <stdio.h> 

int main(void) 
{ 
    float a = 2.225; 
    float b = 123.235; 
    printf("round: %.2f %.2f\n", a, b); 
    printf("round: %.2f %.2f\n", 2.225, 123.235); 
    printf("round: %.2f %.2f\n", 2.225F, 123.235F); 

    return 0; 
} 

出力:

round: 2.22 123.24 
round: 2.23 123.23 
round: 2.22 123.24 
4
2.225 

タイプdoubleの、リテラルです。 floatdoubleを割り当てるさ

float a = 2.225; 

(失う精度、以下を参照のこと)。

printf("%.2f", ...); 

これは、印刷されdouble(あなたは合格しても昇進を入力によるパラメータとしてfloat、)、小数点以下2桁の精度に。

float a = 2.225; 
printf("%.2f", a); 

これは、次いで、バックdouble(タイププロモーション)にそれを鋳造、doublefloatに割り当て、それを印刷しています。

printf("%.2f", 2.225); 

これはdouble無し前後キャスティング)を印刷されています。

印刷時の丸めルールは何ですか?

予想どおり丸みを帯びていますが、問題はありません。 あなたabfloatあるため

出力に差が発生し、直接印刷リテラルはではありません。あなたは、浮動小数点によるキャストによる精度の低下が違いを生む値を選んだことがあります。

これらの2つの状況でどのように同じ印刷結果が得られますか?

doubleを一貫して使用してください。

double a = 2.225; 
double b = 123.235; 
関連する問題