2

次のようにfloat変数に格納するときに、整数をfloatに型キャストしない場合、数値的に何が起こるかを尋ねたかっただけです。

int32 IntVar1 = 100
int32 IntVar2 = 200
float FloatVar = IntVar1/IntVar2;

現在私はこれをやっています:

int32 IntVar1 = 100
int32 IntVar2 = 200
float FloatVar = float(IntVar1)/float(IntVar2);

しかし、私が持っているコードの量では、これは本当に遅れているように見えます。int変数をfloatに変更することを考えましたが、それはパフォーマンスに影響を与えると思います。また、整数値は小数を保持することを想定していないため、完全に無駄に感じます。

だから私は、オプション1が機能する可能性がある方法はありますか?または、変数を型キャストまたは変数変換して浮動小数点にする必要がありますか?(すべての型キャストにより、コードがほとんど読めなくなります)

4

4 に答える 4

3

時期尚早の最適化についてはあまり心配しません。値を型として表現する方が理にかなっている場合は、それを選択してくださいfloat。プログラムが必要な速度で実行されず、プロファイルを作成し、浮動小数点演算が問題であることがわかっている場合は、プログラムを高速化する方法を考え始めてください。

私はすべてのキャスティングで読みやすさを重視しますが、それはあなたの本能でもあるようです。

また、この質問にはC ++のタグが付いているので、(残念ながら?)より慣用的な方法だと思います。

float FloatVar = static_cast<float>(IntVar1)/IntVar2
于 2012-08-01T15:40:26.727 に答える
3

関数の魔法を見よ:

float div(int x, int y)
{
    return float(x) / float(y);
}

今、あなたは言うことができます:

int32 IntVar1 = 100
int32 IntVar2 = 200
float FloatVar = div(IntVar1, IntVar2);
于 2012-08-01T15:52:15.710 に答える
1

これらのオペランドの少なくとも1つを浮動小数点にする必要があります。そうでない場合、除算は切り捨てられます。私は通常、最初のオペランドをキャストします。

float FloatVar = (float)IntVar1/IntVar2;

エレガンスに関しては、それほど悪くはありません。

于 2012-08-01T15:37:30.407 に答える
0

ISO/IEC 規格- N3797 - セクション 5.6に従って

整数オペランドの場合、/ 演算子は、小数部分が破棄された代数商を生成します。商 a/b が結果の型で表現できる場合、(a/b)*b + a%b は a に等しくなります。それ以外の場合、a/b と a%b の両方の動作は未定義です。

小数部分の破棄は、ゼロ方向への切り捨てと呼ばれます。

小数部分が切り捨てられても不思議ではありません

22/7
于 2016-02-06T18:52:39.353 に答える