3

次のように、式で間違ったリテラルを使用することがよくあります。たとえば、floatをintで除算します。

float f = read_f();
float g = f / 2;

この場合、コンパイラは最初にintリテラル(2)をfloatに変換してから、除算演算子を適用すると思います。GCCとClangは常にそのようなものを通過させてきましたが、VisualC++は暗黙の変換について警告します。だから私はそれをこのように書かなければなりません:

float f = read_f();
float g = f / 2.0f;

それは私に不思議に思いました:私は常にfloat、double、longなどに適切なリテラルを使用する必要がありますか?私は通常、intリテラルを使用することができますが、それが実際に良いアイデアかどうかはわかりません。

  • これは微妙なエラーの原因である可能性がありますか?
  • これは式だけの問題ですか、それとも関数パラメーターの問題ですか?
  • そのような暗黙の変換について警告するGCCまたはClangの警告レベルはありますか?
  • unsigned int、long intなどはどうですか?
4

2 に答える 2

2

使用するリテラルのタイプを常に明示的に示す必要があります。これにより、たとえば次のようなコードの場合の問題を防ぐことができます。

float foo = 9.0f;
float bar = foo / 2;

結果を切り捨てて、次のように変更します。

int foo = 9;
float bar = foo / 2;

オーバーロードとテンプレートが関係している場合は、関数パラメーターにも問題があります。

gccが持っていることは知って-Wconversionいますが、それがカバーするすべてを思い出すことができません。

適合する整数値の場合、int私は通常、それらを修飾しません。longまたはunsigned、通常、微妙なバグの可能性がはるかに少ないためです。

于 2012-10-30T16:34:23.893 に答える
1

「すべき」質問に対する絶対的に正しい答えはほとんどありません。誰がこのコードを使用するのか、そして何のために?それはここに関連しています。ただし、特にフロートに関係する場合は、必要な操作を正確に指定する習慣を身に付けることをお勧めします。 float*float単精度で行われます。doubleを使用するものはすべて倍精度で実行2され、doubleに変換されるため、ここでさまざまな演算を指定します。

ここでの最良の答えは、すべてのコンピューター科学者が浮動小数点演算について知っておくべきことです。tl; drしないでください、浮動小数点を使用した簡単な答えはありません。

于 2012-10-30T16:37:58.763 に答える