teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

小数部の対応について検討。

2018/10/20 14:18

投稿

pepperleaf
pepperleaf

スコア6385

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 * GoldenNum); // 小数部は切り捨てだからこれで良いと思う
6
+ s_int = x.a + floor(x.b * q); // 小数部は切り捨てだからこれで良いと思う
7
- t_int = y.a + floor(y.b * GoldenNum);
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 * GoldenNum); // 小数部は切り捨てだからこれで良いと思う
12
+ s_int = (int)(x.a + x.b * q); // 小数部は切り捨てだからこれで良いと思う
13
- t_int = (int)(y.a + y.b * GoldenNum);
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 は、浮動小数の誤差対策です。