数字の後の「f」


102

何をf数字が示した後?これはCまたはObjective-Cのどちらですか?これを定数に追加しないことで違いはありますか?

CGRect frame = CGRectMake(0.0f, 0.0f, 320.0f, 50.0f);

なぜ私が書けないのか説明してもらえますか?

CGRect frame = CGRectMake(0, 0, 320, 50);

回答:


88
CGRect frame = CGRectMake(0.0f, 0.0f, 320.0f, 50.0f);

浮動小数点定数を使用します。(定数0.0は、通常、Objective-Cでdoubleを宣言します。最後にfを置く-0.0f-定数を(32ビット)floatとして宣言します。)

CGRect frame = CGRectMake(0, 0, 320, 50);

floatに自動的に変換されるintを使用します。

この場合、2つの間に(実用的な)違いはありません。


24
理論的には、コンパイラーはコンパイル時に浮動小数点に変換するほどスマートではなく、4つのint-> float変換(実行速度が最も遅いキャストの1つ)によって実行速度が低下します。この場合はほとんど重要ではありませんが、必要に応じて常にfを正しく指定することをお勧めします。式で正しい指定子のない定数は、式全体を強制的にdoubleに変換する可能性があり、タイトなループの場合、パフォーマンスヒットは目立つ。
Matteo Italia

60

疑問がある場合は、アセンブラの出力を確認してください。たとえば、このような小さな、最小限のスニペットを書きます

#import <Cocoa/Cocoa.h>

void test() {
  CGRect r = CGRectMake(0.0f, 0.0f, 320.0f, 50.0f);
  NSLog(@"%f", r.size.width);
}

次に、-Sオプションでアセンブラーにコンパイルします。

gcc -S test.m

アセンブラーの出力をtest.sファイルに保存.0fし、定数から削除して、コンパイルコマンドを繰り返します。次にdiff、新しいものtest.sと以前のものを実行します。本当の違いがあるかどうかがわかるはずだと思います。あまりにも多くの人が、コンパイラーが何をしているのかというビジョンを持っていると思いますが、結局のところ、理論を検証する方法を知っておく必要があります。


11
なしでも、出力は同じであることがわかりました-O。私はi686-apple-darwin10-gcc-4.2.1(GCC)を使用しています
kizzx2

2
LLVMバージョン7.0.0(clang-700.0.65)x86_64-apple-darwin15.0.0で上記の例を試しましたが、.outファイルも同じでした。
Nick、

43

時々違いがあります。

float f = 0.3; /* OK, throw away bits to convert 0.3 from double to float */
assert ( f == 0.3 ); /* not OK, f is converted from float to double
   and the value of 0.3 depends on how many bits you use to represent it. */
assert ( f == 0.3f ); /* OK, comparing two floats, although == is finicky. */

26

これは、これが浮動小数点数であることをコンピューターに伝えます(ここではc / c ++について話していると思います)。数値の後にfがない場合、それはdoubleまたは整数と見なされます(10進数があるかどうかによって異なります)。

3.0f -> float
3.0 -> double
3 -> integer

この規則はC ++標準の一部ですか、それともコンパイラーにありますか?
jxramos

1
私が知る限り、それは標準の一部です(私が間違っていれば誰かが私を修正します)。私が見つけることができる最も速い参照はopen-std.org/jtc1/sc22/open/n2356/lex.html#lex.fconですが、それらを探したい場合は、おそらくより最新の参照があります。
NickLH

5

ソースコード内の浮動小数点リテラルは、doubleとして解析されます。float型の変数に割り当てると、精度が失われます。多くの精度で、7桁の有効数字を破棄します。「f」接尾辞を使用すると、コンパイラーに「私は自分のやっていることを知っています。これは意図的なものです。バグを犯さないでください」と伝えます。

バグが発生する確率はそれほど小さいものではありません。多くのプログラムは、思いがけない浮動小数点の比較、または0.1が正確に表現可能であると想定して、熱心に取り組んできました。


4

fあなたが話していることは、おそらくそれはフロートで働いていることをコンパイラに伝えるためのものです。を省略するとf、通常はdoubleに変換されます。

どちらも浮動小数点数ですが、a floatはa よりビット数が少ない(そのため、サイズが小さく精度が低い)double


3

それはCのものです-浮動小数点リテラルはデフォルトで倍精度(double)です。fサフィックスを追加すると、単精度(float)になります。

intを使用してここで値を指定することができます。この場合、違いはありませんが、正しいタイプを使用することは良い習慣です-一貫性は一般的に良いことであり、後でこれらの値を変更する必要がある場合は一見すると、それらがどのタイプであるかがわかります。


2

Cから。フロートリテラル定数を意味します。「f」と「.0」の両方を省略し、intを浮動小数点数に暗黙的に変換するため、例ではintsを使用できます。


1

これはほぼ確実にCからのものであり、「double」型ではなく「float」型を使用したいという要望を反映しています。これは、長整数であることを示すために、数字のLなどの接尾辞に似ています。整数を使用するだけで、コンパイラーは(この特定のシナリオの場合)必要に応じて自動変換します。


0

通常は、値がfloat、つまり浮動小数点整数であることをコンパイラーに通知します。これは、整数、小数値と指数関数を格納できることを意味し、例えば10.4または1.2e+22

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.