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

回答編集履歴

1

確認作業を行ったので追記。

2019/12/27 11:49

投稿

退会済みユーザー
answer CHANGED
@@ -1,6 +1,19 @@
1
- 今スマホなので自信はないですが、見たところ論理的には合っていそうなので可能性としては浮動小数点誤差ではないでしょうか。
1
+ ~~今スマホなので自信はないですが、見たところ論理的には合っていそうなので可能性としては浮動小数点誤差ではないでしょうか。~~
2
2
  ```C
3
3
  for(int i=1; i<=(log(N/2)/log(5)); i++){
4
4
  ```
5
5
  ここがかなり怪しく、境界値条件で引っかかっている物と思われます。
6
- 例えばN=50のとき、正しくはi<=2になって欲しいですが、logを挟んでいるため誤差が乗り限りなく2に近いが2に満たない価になっている可能性があります。
6
+ 例えばN=50のとき、正しくはi<=2になって欲しいですが、logを挟んでいるため誤差が乗り限りなく2に近いが2に満たない価になっている可能性があります。
7
+
8
+ 家に着いたので色々確認をとってみました。
9
+
10
+ [1]log計算による浮動小数点誤差
11
+ やはりcoutのprecisionを弄らないとcoutで出ない程度の誤差がlog(125)/log(5)などで見られます。
12
+ ただ、適当に値を試した範囲ではたまたま誤差が+側に触れており、やはりWAの原因ではなさそうです
13
+ (環境依存な可能性もあり、いずれにせよこの条件はやめた方が良いと思いますが)
14
+
15
+ [2]powの計算結果
16
+ これも同じ理由で誤差が出ました。
17
+ 例えば pow(5,24) を試すと 59604644775390624 となり5の倍数ではないことから明らかに誤差を持っています。
18
+
19
+ 整数の問題ではできるだけ怪しい浮動小数点演算は使わず整数で計算した方が良さそうですね。