web-dev-qa-db-ja.com

Objective-C / Cの数値/浮動小数点数の後の「f」

Apple docsでこれを見つけることができません。ここの数字の後の「f」は何を示していますか?これはCまたはObjective-Cからですか?これを追加しないことに違いはありますか?定数?

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

なぜ私が書いていないのか説明できますか:

CGRect frame = CGRectMake(0, 0, 320, 50);
97
typeoneerror
CGRect frame = CGRectMake(0.0f, 0.0f, 320.0f, 50.0f);

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

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

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

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

85
Frank Shearar

疑わしい場合は、アセンブラーの出力を確認してください。たとえば、このような小さな、最小のスニペットを書く

#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を定数から削除して、コンパイルコマンドを繰り返します。次に、新しいtest.sと前のdiffを実行します。実際の違いがあるかどうかを示すはずだと思います。コンパイラが行うと思うことのvisionが多すぎると思いますが、結局のところ、理論を検証する方法を知っている必要があります。

53
epatel

時々違いがあります。

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. */
41
Potatoswatter

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

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

ソースコード内の浮動小数点リテラルは、doubleとして解析されます。 float型の変数に代入すると、精度が失われます。かなりの精度で、有効数字7桁を捨てています。 「f」の接尾辞を使用すると、コンパイラに次のように伝えることができます。

バグを生成する確率はそれほど小さいものではありません。多くのプログラムは、誤った浮動小数点の比較や、0.1が正確に表現可能であると想定していることを隠しています。

5
Hans Passant

あなたが話しているfはおそらく、コンパイラが浮動小数点で動作していることを伝えるためのものです。 fを省略すると、通常はdoubleに変換されます。

両方とも浮動小数点数ですが、floatdoubleよりも少ないビットを使用します(したがって、より小さく、精度が低くなります)。

4
Yuri

これはCのものです-浮動小数点リテラルはデフォルトで倍精度(倍精度)です。 f接尾辞を追加すると、単精度(浮動)になります。

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

3
Paul R

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

2
Wildcat

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

1
tyranid

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

0
Polynomial