2011-01-28 2 views
41

プログラムで "1/3.f"が見え、 ".f"が何であったのか疑問に思っていました。だから私自身のプログラムを試した:番号に ".f"を追加する目的は?

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

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

+19

+1あなた自身のプログラムを試して、仮説を立てるためです。つまり、あなたはおそらく[書籍](http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list)から学んでいることを確認したいと思うでしょう。新しい言語を学ぶ最も良い方法。 – GManNickG

+1

プログラムの出力は何ですか?私は自分でそれをすることができましたが、それも含まれていいと思った – andrewtweber

答えて

38

.fなし数はしたがって1/3代わり所望(float)0.333333(int)1/(int)3 =>(int)0あり、整数として解釈されます。 .fは、float型の浮動小数点数としてリテラルを解釈するようにコンパイラに指示します。例えば、0ULのような他のそのような構成体は、(unsigned long)0を意味する一方、平文0(int)0である。

.fは、実際にリテラルは浮動小数点数ではなく整数であり、デフォルトdouble型を使用するのではなく、リテラルはfloat型であるべきでコンパイラに指示fサフィックスであることを示している.二つの成分であります浮動小数点リテラルの場合

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

あなたがそれらに使用できるリテラルと接尾辞についてのすべてを知りたい場合は、C++標準、(1997 draftC++11 draftC++14 draftC++17 draft)または代わりを読むことができるが、のような、まともな教科書を見てStroustrupのThe C++ Programming Language。さておき、あなたの例では(float)1/3リテラル13として

は実際には整数ですが、それは右側のオペランドがあるので、1はその後3は、暗黙的にfloat型にキャストしますあなたのキャストによってフロートへの最初のキャストであり、浮動小数点演算子の。 (左オペランドは浮動小数点であるため、演算子は浮動小数点です。)

+0

ありがとう...私はこの種の構文がキャスト構文が利用可能であるにもかかわらず存在することに驚いています。私がそれについてもっと読むことができる場所? "浮動小数点リテラル"のためのグーグルを試みましたが、有用な情報を見つけることができませんでした。 – Nav

+6

ペダンティックな '3.'はintでなくdoubleとして解釈されます。 – peoro

+0

@peoro確かに、 '.f'なしで言うべきです、今すぐ固定 – wich

8

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

49

3.3.0と等価です。これは2倍です。

fに続く数値リテラルは、それを浮動小数点にします。

+3

簡単な質問とあなたは本当にそれに答えている唯一のものです。 – CashCow

+3

+1とシンプルな答え(とあなたの素敵な羊のアバター)。 – Johan

+2

+1修正します。 :-) –

15

デフォルトでは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; 

が出力:3.2
Bと等しくない

は3に等しいです。2F

ここideoneで実験を行います。http://www.ideone.com/WS1az

doublefloatから変数aの種類を変更してみてください、再び結果を参照してください!それは本当にあなたがCやC++ですべてがリテラルを含む、入力されていることを理解する必要が

を.Fされていないので、

+0

ありがとうございます。彼らはideoneにコードを貼り付けさせるだけですか、それとも実際に実行しますか? – Nav

+0

@Nav:あなたも実行できます。ここの左側の「送信」ボタンをクリックしてください:http://www.ideone.com/clone/WS1az – Nawaz

+1

クール!ありがとう:) – Nav

2

小数点およびfは異なる目的を持っています。

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

IEEE浮動小数点は、倍精度よりも精度が劣ります。 floatは32ビットのみを使用し、22ビットの仮数と10ビットの指数(それぞれの符号ビットを含む)を使用します。

倍精度では精度は向上しますが、そのような精度は必要ない場合があります(たとえば、最初の見積もりだけの数値で計算している場合など)。floatで与えられた数値で十分です。精度よりも重要な数(例えば、時系列データを多く処理する)

したがって、floatは依然として便利なタイプです。

これは、printfと同等の文で使用されている表記法と混同しないでください。