回答編集履歴
1
小数部の対応について検討。
answer
CHANGED
@@ -3,18 +3,26 @@
|
|
3
3
|
整数部が一致しない件は、otnさんが書かれたように、(int)のキャストが原因。
|
4
4
|
5桁とかが問題で無く、bの値が xと yで符号が異なるからです。ここは、floor()関数で解決すると思います。
|
5
5
|
```C
|
6
|
-
s_int = x.a + floor(x.b *
|
6
|
+
s_int = x.a + floor(x.b * q); // 小数部は切り捨てだからこれで良いと思う
|
7
|
-
t_int = y.a + floor(y.b *
|
7
|
+
t_int = y.a + floor(y.b * q);
|
8
8
|
```
|
9
9
|
|
10
10
|
こちらでも同じですが、、
|
11
11
|
```C
|
12
|
-
s_int = (int)(x.a + x.b *
|
12
|
+
s_int = (int)(x.a + x.b * q); // 小数部は切り捨てだからこれで良いと思う
|
13
|
-
t_int = (int)(y.a + y.b *
|
13
|
+
t_int = (int)(y.a + y.b * q);
|
14
14
|
```
|
15
15
|
|
16
16
|
次に問題となるのは、小数部の比較。
|
17
17
|
浮動小数点(double)で、 == 一致するのは、特殊な場合のみ。同じ数値の組合せで無い場合、一致するのは、稀と思います。一般には、一定の値未満の場合、同じと見なすべきと思いますが、この扱いがもう一つ。
|
18
18
|
|
19
19
|
現在の方法では、double で計算しても同じなので、もう一つしっくりこないです。
|
20
|
-
回答依頼がありましたので、一応。。。
|
20
|
+
回答依頼がありましたので、一応。。。
|
21
|
+
|
22
|
+
[追記]
|
23
|
+
小数部の比較ですが、
|
24
|
+
```C
|
25
|
+
int x_dec = (int)(((x.b * q) - floor(x.b * q)) * q + 0.1);
|
26
|
+
```
|
27
|
+
とすれば、x の小数部に対応する整数が取得できると思うので、y についても同様に求め、比較すれば、良いと思うのですが、どうでしょう。 (時間が取れれば、確認予定)
|
28
|
+
なお、式内の +0.1 は、浮動小数の誤差対策です。
|