web-dev-qa-db-ja.com

C ++ int floatキャスト

Mが常に0なのはなぜですか? someClassのxおよびyメンバーは整数です。

float getSlope(someClass a, someClass b)
{           
    float m = (a.y - b.y) / (a.x - b.x);
    cout << " m = " << m << "\n";
    return m;
}
25
el_pup_le

整数の除算が行われ、結果整数が浮動小数点として割り当てられます。結果が1未満の場合、結果は0になります。

分割する前に、最初に式をフロートにキャストする必要があります。

float m = (float)(a.y - b.y) / (float)(a.x - b.x);
43
BoltClock

キャストを使用する必要があります。私は他の答えを見て、それらは実際に機能しますが、タグは_C++_なので、 _static_cast_ を使用することをお勧めします:

float m = static_cast< float >( a.y - b.y ) / static_cast< float >( a.x - b.x );
55
Kiril Kirov

整数を含む式を評価する際、評価の各段階からの一時的な結果も整数に丸められることに注意してください。 float mへの割り当てでは、整数演算後、値は実数対応float型にのみ変換されます。これは、たとえば、3/4が0.0になる前にすでに「0」値であることを意味します。変換を強制的にフロートさせる必要があります。これを行うには、a.yb.ya.xb.xa.y - b.y、またはa.x - b.xのいずれかで構文float(value)を使用します。分裂が起こる、例えば.

float m = float(a.y - b.y) / (a.x - b.x); 
float m = (float(a.y) - b.y) / (a.x - b.x); 
...etc...
1
Tony Delroy

彼は整数除算を行います。つまり、3/4 = 0です。ブラケットの1つを浮動小数点数にキャストします。

 (float)(a.y - b.y) / (a.x - b.x);
0
Ronny Brendel

整数で計算を実行し、その結果をfloatに割り当てています。したがって、コンパイラは暗黙的に整数の結果を浮動小数点に変換しています

0
Vineet G

(a.y-b.y)が(a.x-b.x)より小さい場合、mは常にゼロです。

このようにキャストします。

float m = ((float)(a.y - b.y)) / ((float)(a.x - b.x));
0

(a.y-b.y)はおそらく(a.x-b.x)よりも小さく、コードでは除算の後にキャストが行われるため、結果は整数なので0になります。

/操作の前にフロートにキャストする必要があります

0