web-dev-qa-db-ja.com

数字に「.f」を追加する目的は?

私はプログラムで「1/3.f」を見て、「。f」が何のためにあるのか疑問に思いました。だから自分のプログラムを試してみました:

#include<iostream>
using namespace std;
int main()
{
        cout<<(float)1/3<<endl;
        cout<<1/3.f<<endl;
        cout<<1/3<<endl;
}

.fはキャストのように使用されますか?この興味深い構文についてもっと読むことができる場所はありますか?

49
Nav

.fがないと、数値は整数として解釈されるため、1/3は、目的の(int)1/(int)3ではなく(int)0 => (float)0.333333になります。 .fは、リテラルをfloat型の浮動小数点数として解釈するようコンパイラーに指示します。たとえば、0UL(unsigned long)0を意味しますが、プレーンな0(int)0になります。

.fは実際には2つのコンポーネントです。.はリテラルが整数ではなく浮動小数点数であることを示し、fサフィックスはリテラルが浮動小数点リテラルに使用されるデフォルトのdouble型ではなく、float型。

免責事項;上記の説明で使用されている「キャスト構造」は実際のキャストではなく、リテラルのタイプを示すための単なる方法です。

リテラルとそれに使用できるサフィックスについてすべて知りたい場合は、C++標準( 1997 draftC++ 11 draft 、-を読むことができます。 C++ 14ドラフトC++ 17ドラフト )または、Stroustrupの C++プログラミング言語 などの適切な教科書をご覧ください。

余談ですが、あなたの例では(float)1/3リテラル1および3は実際には整数ですが、キャストによって最初に1がfloatにキャストされ、その後3が暗黙的にキャストされます浮動小数点演算子の右側のオペランドであるため、float。 (演算子は、左側のオペランドが浮動小数点であるため、浮動小数点です。)

43
wich

3.3.0と同等で、倍精度です。

数値リテラルに続くfは、floatになります。

55
peoro

デフォルトでは3.2doubleとして扱われます。そのため、コンパイラーにfloatとして処理させるには、最後にfを記述する必要があります。

この興味深いデモンストレーションをご覧ください。

float a = 3.2;
if ( a == 3.2 )
    cout << "a is equal to 3.2"<<endl;
else
    cout << "a is not equal to 3.2"<<endl;

float b = 3.2f;
if ( b == 3.2f )
    cout << "b is equal to 3.2f"<<endl;
else
    cout << "b is not equal to 3.2f"<<endl;

出力:

aは3.2と等しくない
bは3.2fに等しい

Ideoneでここで実験してください: http://www.ideone.com/WS1az

変数aのタイプをfloatからdoubleに変更してみてください。結果をもう一度確認してください。

19
Nawaz

3.fは3.0fの短縮形です。3.0は、float型の浮動小数点リテラルとしての数値です。

8
jcoder

小数点とfの目的は異なるため、実際には.fではありません。

CおよびC++では、リテラルを含むすべてが入力されることを理解する必要があります。

3はリテラル整数です。 3.はリテラルdoubleです3.fはリテラルfloatです。

IEEE floatはdoubleよりも精度が低くなります。 floatは32ビットのみを使用し、22ビットの仮数と10ビットの指数(それぞれの符号ビットを含む)を使用します。

doubleを使用すると精度が向上しますが、そのような精度は必要ない場合があり(たとえば、最初の推定値のみの数値で計算を行う場合)、floatで与えられるもので十分であり、大量に格納する場合(たとえば、正確さよりも重要な多くの時系列データを処理します。

したがって、floatは依然として有用な型です。

これを、printfおよび同等のステートメントで使用される表記法と混同しないでください。

2
CashCow