6

私が取り組んでいるコードでこれに出くわしました:

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です。)

面倒なことをするのには本当に正当な理由があると思います

static_cast<double>(1)

などですが、タイピングを大幅に減らすことができたようです。

私は何を理解していませんか?

前もって感謝します。

4

3 に答える 3

7

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

于 2011-03-23T22:19:15.100 に答える
2

2.0ここではるかに優れた前の回答に同意します。

ただし、コード内に別の赤いフラグ、つまりpow(something, 3). このpow関数は、x と y の 2 つの任意の値を取り、 x^y を返すように設計ます。この関数は任意の値を処理する必要があるため、近似を行います。ただし、これは 1) 計算が複雑であり、2) 場合によっては的を外します。この場合、単純に を使用する方がはるかに優れていsomething4 * something4 * something4ます。

于 2011-03-23T22:27:31.293 に答える
1

これは、はるかに読みやすい

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

算術演算に 1 つの double オペランドが含まれるたびに、整数が double に昇格されるためです。0.5倍のリテラルは、すべてを倍増させるのに十分です。

于 2011-03-23T22:33:44.537 に答える