1

だから、私はCプログラムを読んでいます。本と私はこの演習を読みました:

Write a program which asks the user to enter a dollars-and-cents amount, then displays the amount with 5% added?

解決 :

#include <stdio.h>

int main(void) {

    float original_amount;

    printf("Enter an amount: ");
    scanf("%f", &original_amount);
    printf("With tax added: $%.2f\n", original_amount * 1.05f);

    return 0;
}

意味はわかり.3fますが (後ろに 3 桁あるはずです...)、でもどういう1.05f意味ですか?

4

6 に答える 6

7

do1.05fは、値が約 1.05 (105% = 100% + 5%) の浮動小数点数を表します。は%.2fフォーマット指定子であり、非常に異なるものです。

この数値を乗算すると、実際には値に 5% が加算されます (値 * 1.05 = 値 * (100% + 5%) = 値 + 値 * 5%)。

形式指定子は、printf-like 関数の最初のパラメーターで発生し、その位置に対応する引数を出力する方法を関数に指示します。

于 2013-07-19T10:04:07.320 に答える
1

1.05fこのプログラムは、数値に 5% を加算する方法として乗算を使用しているようです。しかし、表現誤差のため、 1.05f は正確には 1.05 ではありません。これは、 1.05 に近い†</sup>の単精度浮動小数点数です。

1.05 に最もfloat近い値は1.0499999523162841796875(通常の 32 ビット float 形式を想定) です。結果を四捨五入するため、誤差の影響を確認するにはかなり大きな数を使用する必要があります。プログラムが金額を尋ねてきたら、100000000 と入力してみてください。

Enter an amount: 100000000
With tax added: $104999992.00

単精度の代わりに倍精度を使用した場合、つまり と の代わりdoubleにを使用した場合、表現誤差は小さくなりますが、それでも正確には 1.05 にはなりません。使用する。100000000 に対しては正しい結果が得られますが、天文学的に大きな数に対しては「正しくない」結果が得られます。float1.051.05f


†) どれだけ近いか?標準から:

10 進浮動定数の場合、および FLT_RADIX が 2 の累乗でない場合の 16 進浮動定数の場合、結果は最も近い表現可能な値、または最も近い表現可能な値のすぐ隣にあるより大きなまたはより小さな表現可能な値であり、実装定義の方法で選択されます。 .

于 2013-07-19T10:49:59.200 に答える
0

printfのプロトタイプはint printf(const char *restrict format, ...);であり、文字列を使用してconst char *restrict format印刷されるデータをフォーマットします。

%.2f最初のパラメーターとして渡されるフォーマット指定子printf1.05f、引数リストの一部として渡されるフォーマット指定子の間で混乱しています。ご指摘のとおり、最初のものはフォーマットに使用されます。引数リスト1.05fは計算目的で使用されますf。 はコンパイラに を使用することを示します。floatそれ以外の場合、デフォルトではdoubleデータ型と見なされ、 の結果original_amount * 1.05fが に格納されますdouble

float数値が範囲に収まることがわかっている場合は、a を使用するだけで十分です。これを示すには、引数リストの数値にfloata を追加します。f

于 2013-07-19T11:18:35.620 に答える
0

それ5%はあなたのエクササイズの一部です。これは次のようになります: original_amout + (original_amout * 5.0 / 100.0)。

于 2013-07-19T10:04:47.357 に答える
0

それはfを取り除くことができるfloat floatとして1.05を意味し、それはうまくいくはずです

于 2013-07-19T10:04:56.320 に答える