2011-07-17 11 views
4

ここに...理解に私のコードからの抜粋ですありません。..フロートC++で四捨五入されていると私は、私はこのことについて非常に混乱していますなぜ

float m = 0.0, c = 0.0; 
printf("toprightx = %d bottomrightx = %d toprighty = %d bottomrighty = %d\n", 
    toprightx, bottomrightx, toprighty, bottomrighty); 
// find m and c for symmetry line 
if (toprightx == bottomrightx) { 
    m = (-toprighty + bottomrighty); 
} 
else { 
    m = (-toprighty + bottomrighty)/(toprightx - bottomrightx); 
} 

c = -toprighty - (m * toprightx); 

printf("m = %f and c = %f\n", m, c); 

そして、ここでは出力されます:

toprightx = 241 bottomrightx = 279 toprighty = 174 bottomrighty = 321 
m = -3.000000 and c = 549.000000 

なぜ出力が丸められますか?私はそれらが浮動小数点として宣言しているので、なぜコードが整数を返すのか分からない。 mの正しい値は-3.8684でなければなりません。

(つまりtoprightx、bottomrightx、toprighty、bottomrightyに注意してくださいは、さらに、コードで、最大の整数として宣言されています。)C++が彼らのために、整数計算を使用していますので、あなたは、あなたの計算にだけint型のを使用しているためだ

+5

クラシック........ – Mehrdad

+1

私はCプログラマではないんだけど、私はそれが(使用されている変数による)最初の整数演算を行い、結果を詰め込むかなり確信していますフロート内にある。他の変数を浮動小数点として定義する必要があります。 –

+0

なぜ「toprightx、bottomrightx」が違うのですか? 'toprightx'が少ない場合は、 'topleftx' [または単に 'left']にするべきではありませんか? – Random832

答えて

14

このコードでは、toprightx、bottomrightx、toprighty、bottomrightyは整数として が宣言されています。

あなたの答えがあります。整数だけを含む計算は、除算を含む整数計算で実行されます。その結果がフロートに割り当てられることは重要ではありません。

これを修正するには、x/y値の少なくとも1つを浮動小数点として宣言するか、計算で浮動小数点にキャストします。

3

。あなたのint変数の1つを浮動小数点型にキャストすれば、良い結果が得られます。

m = (-toprighty + bottomrighty)/(toprightx - bottomrightx);からm = (-toprighty + bottomrighty)/(float)(toprightx - bottomrightx);に変更します。あなたはこのラインに整数の除算を実行している

7

:topright、bottomrighty、toprightxので

(-toprighty + bottomrighty)/(toprightx - bottomrightx); 

、およびすべての整数はbottomrightxあり、その式の結果も整数になります。 equaitionが整数を計算した後、floatに代入します。 bottomrighty山車として、

(-toprighty + bottomrighty + 0.0)/(toprightx - bottomrightx); 
2

宣言toprightx、bottomrightx、toprightyまたは混合演算に尋ねる前に浮くためにそれらをキャスト:あなたはこの代わりのような何かを行うことができ

float m = -3;

:それは同等です。

1

浮動小数点演算を使用する部門を強制するために、浮動小数点数に除数をキャストしてみてください。

m = (-toprighty + bottomrighty)/(float)(toprightx - bottomrightx); 
+0

分子または分母のいずれかをキャストするだけの場合は、分子をキャストする方がはるかに優れています。なぜ人間の読者からそのキャストを隠すのですか? –

2

(あなたがやっているように、暗黙のうちに)キャスティングint型へのフロートは、データが切り捨てられます新しいタイプには適合しません。

データは切り捨てられていないため、切り捨てられています。

5

ここにあなたのための時間intです:

m = (-toprighty + bottomrighty)/(toprightx - bottomrightx); 
     ^int  ^int    ^int  ^int 

これらの操作はすべて、整数除算(浮動小数点を切り捨て)を用いて行われ、その後、floatにキャストされます。代わりに試してみてください:

m = float(-toprighty + bottomrighty)/(toprightx - bottomrightx); 
+2

+1をh 'int'に、そして、分子をキャストすることです。分母のキャストも機能しますが、そのキャストはコードの人間の読者から隠れています。分子をキャストすることは、浮動小数点の結果が望まれることを偶然の読者にとってさえもっきりと明らかにする。 –

関連する問題