質問

私が作業しているコードでこれに遭遇しました:

double part2 = static_cast<double>(2) * somthing1
  * ( static_cast<double>(1) + something2 )
  + ( static_cast<double>(1) / static_cast<double>(2) ) * something3
  + ( static_cast<double>(1) / static_cast<double>(2) ) * pow ( something4, 3 );

(ザ- somethingsは doubles。)

I 容疑者 やってのトラブルを通過するための本当に良い理由があること

static_cast<double>(1)

そして、そのようなものですが、私ははるかに少ないタイピングで得ることができるようです。

私は何を理解していないのですか?

事前に感謝します。

役に立ちましたか?

解決

これらの多く static_castsは自動数値昇進のために不必要、である。非常に必要なものは、数1/2を構築する際に使用されるものですが、この場合、単に言わない明白な理由はありません 0.5 代わりに。いずれにせよ、注意を払っているコンパイラはこれらをすべて削除し、コンパイル時定数に置き換えます。

他のヒント

私は以前の答えに同意します 2.0 ここでははるかに良いでしょう。

しかし、私はコードに別の赤い旗を見つけました。 pow(something, 3).ザ- pow 関数は、2つの任意の値を取るように設計されています, xy と返す x^y.この関数は任意の値を処理しなければならないので、近似を行います。ただし、この1)は計算が複雑で、2)はマークを見逃すことがあります。この場合、単純に使用する方がはるかに優れています something4 * something4 * something4.

これは、はるかに読みやすいものと同等です

double part2 = 2 * somthing1 * (1 + something2)
  + 0.5 * something3 + 0.5 * something4 * something4 * something4

算術演算が1つのdoubleオペランドを持つたびに、整数はdoubleに昇格されるためです。0.5倍のlitteralは、すべてを2倍にするのに十分です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top