質問
整数のべき乗根を求める際、誤差が含まれないような計算方法はありますでしょうか?
もしくは、誤差が計算結果になるべく影響しないような回避方法はありますでしょうか?
*** 追記 ***
『少数全てを整数として扱いたい』のではなく、『誤差だけを回避したい』というイメージでしょうか。
python
1>>> 216 ** (1/3) 25.999999999999999 # 6となってほしい… 3 4 5""" 以下、追記 """ 6 7>>> 217 ** (1/3) 86.009245006917366 9>>> 215 ** (1/3) 105.990726414895092 # これらの結果は少数として扱いたい…
背景
AtCoder ABC097のB問題を、Pythonで以下の様に実装しております。
サンプルは通ったものの、一つのテストケースでWAとなりました。
python
1import math 2 3x = int(input()) 4slv = lambda b, p: math.floor(b ** (1/p)) ** p 5print(max([slv(x, p) for p in range(2, 10)]))
原因を調べたところ、入力を「216」や「343」としたとき、b ** (1/p)に(丸め?)誤差が含まれていることがわかりました。
試したこと
上記コードのmath.floor内の計算を、
python
11: math.pow(b, 1/p) 22: b ** Fraction(1, p)
などと試してはみました。が、解決はしませんでした。
所感
WAが起こっている原因の調査のために、他のアルゴリズム(逐一べき乗を計算する)で実装を行ったため課題自体は解決できたものの、このアルゴリズムで何とかできないものなのかと引っかかっています…
ただ、質問内容自体も乱暴な気がしますし、ここまで書いてこのアルゴリズムは諦めるべきかもという気がしてきました…

回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/05/18 05:39
2018/05/18 06:11
2018/05/18 06:16
2018/05/18 06:58