質問: compare(x, y); printf("%d\n",n); return 0; } ``` ### 補足情報(FW/ツールのバージョンなど) Unix gccコンパイラ
回答: 多分、求める結果にはならないと思いますが、、、、 整数部が一致しない件は、otnさんが書かれたように、(int)のキャストが原因。 5桁とかが問題で無く、bの値が xと yで符号が異なるからです。ここは、floor()関数で解決すると思います。 ``` s_int = x.a + floor(x.b * q); // 小数部は切り捨てだからこれで良いと思う t_int = y.a + floor(y.b * q); ``` こちらでも同じですが、、 ``` s_int = (int)(x.a + x.b * q); // 小数部は切り捨てだからこれで良いと思う t_int = (int)(y.a + y.b * q); ``` 次に問題となるのは、小数部の比較。 浮動小数点(double)で、 == 一致するのは、特殊な場合のみ。同じ数値の組合せで無い場合、一致するのは、稀と思います。一般には、一定の値未満の場合、同じと見なすべきと思いますが、この扱いがもう一つ。 現在の方法では、double で計算しても同じなので、もう一つしっくりこないです。 回答依頼がありましたので、一応。。。 [追記] 小数部の比較ですが、 ``` int x_dec = (int)(((x.b * q) - floor(x.b * q)) * q + 0.1); ``` とすれば、x の小数部に対応する整数が取得できると思うので、y についても同様に求め、比較すれば、良いと思うのですが、どうでしょう。 (時間が取れれば、確認予定) なお、式内の +0.1 は、浮動小数の誤差対策です。