16

こんにちは、すべてがタイトルにあります。この質問は、特に、のような値NSTimeIntervalCGFloatまたはfloatまたはdoubleであるその他の変数に当てはまります。ありがとう。

編集:文字列でフォーマットするのではなく、値の割り当てを求めています。

編集2:問題は、フロートまたはダブルにプレーンを割り当てることは、終わりのある0ものよりも最悪であるということです。f

4

4 に答える 4

27

基本的な違いは次のとおりです。

1.0または1.二重定数です

1.0fフロート定数です

接尾辞がない場合、小数を含むリテラル(123.0)は、倍精度浮動小数点数として扱われます。それを単精度変数またはパラメーターに割り当てるか渡すと、コンパイラーは警告を発行します(すべきです)。追加fすると、リテラルを単精度浮動小数点数として処理するようにコンパイラーに指示します。

于 2013-01-13T11:17:21.213 に答える
8

変数を初期化する場合、それは意味がありません。コンパイラがすべてのキャストを行います。

float a = 0; //Cast int 0 to float 0.0
float b = 0.0; //Cast 0.0 double to float 0.0 as by default floating point constants are double
float c = 0.0f // Assigning float to float. .0f is same as 0.0f

しかし、これらを式で使用している場合、それは非常に理にかなっています。

6/5 becomes 1
6/5.0 becomes 1.2 (double value)
6/5.0f becomes 1.2 (float value)
于 2013-01-13T12:01:17.397 に答える
3

コードを実行しているターゲットCPUまたはそれが実行するバイナリコードに違いがあるかどうかを調べたい場合は、コードをコンパイルしているコマンドラインの1つをXCodeからコマンドラインに簡単にコピーし、不足している環境変数を修正して、 -S。これにより、比較に使用できるアセンブリ出力が得られます。4つのバリアントすべてを小さなサンプルソースファイルに入れると、ARMアセンブリに精通していなくても、後で結果のアセンブリコードを比較できます。

私のARMアセンブリの経験から(大丈夫... 6年前とGCC)、レジスターをそれ自体とXORして、その内容を0にフラッシュするようなものに1ctを賭けます。

于 2013-01-13T11:26:34.770 に答える
3

0.0、.0、0.0f、さらには0fを使用しても、大きな違いはありません。(doubleとfloatに関してはいくつかあります)(float)0を使用することもできます。

ただし、0と一部のfloat表記には大きな違いがあります。ゼロは常にある種の整数になります。また、代わりにfloat操作が必要な場合は、マシンに整数操作を強制することができます。

ゼロハンディの良い例はありませんが、一般的にfloat / intの例があります。これは、先日私を夢中にさせました。

私は8ビットRGBカラーに慣れています。これは、写真家としての趣味と、HTML開発者としての最近の経歴によるものです。だから、赤、緑、黄色のカカオスタイルの0..1分数に慣れるのは難しいと感じました。それを克服するために、私は以前の値を使用して、255でそれらを分割したいと思いました。

[CGColor colorWithRed: 128/255 green: 128/255 andYellow: 128/255];

それは私にいくつかの素敵なミドルグレーを生成するはずです。しかし、そうではありませんでした。私が試したのは、黒か白のどちらかでした。最初に、これは、この色を使用していたUIテキストオブジェクトの文書化されていない欠陥が原因であると考えました。この定数値が0と1にしか切り上げまたは切り下げできない整数演算を強制することに気付くのにしばらく時間がかかりました。この式は、最終的に私が達成したいことを実行しました。

[CGColor colorWithRed: 128.0/255.0 green: 128.0/255.0 andYellow: 128.0/255.0];

.0を少なくして、同じことを実現できます。しかし、必要に応じてそれらを増やすことは害にはなりません。128.0f /(float)255はどちらでもかまいません。

「Edit2」に応答するように編集します。

float fvar; 
fvar = 0; 

vs..。

fvar = .0;

結局、それはまったく違いを生まない。fvarには、0.0に近い(ただし常に等しいとは限らない)float値が含まれます。60番目と70番目のコンパイラの場合、に関連するマイナーなパフォーマンスの問題があると推測しましたfvar = 0。つまり、コンパイラは最初にint 0を作成し、割り当ての前にこれをfloatに変換する必要があります。今日の最新のコンパイラは、古いコンパイラよりもはるかに優れた方法で自動的に最適化する必要があります。最後に、マシンコードの出力を調べて、違いが生じるかどうかを確認する必要があります。しかし、fvar = .0;あなたと一緒に常に安全な場所にいます。

于 2013-01-13T11:34:47.417 に答える