実現したいこと
以下のようなコードの場合の少数の処理をどのように行うべきか知りたいです。
発生している問題・エラーメッセージ
入力例
10
1 1 10
10
出力結果
#1.0 0.1
#1.0 0.2
#1.0 0.30000000000000004
#...
#10.0 9.99999999999998
USAGI
本来であればUSAGIのところに
DRAWを表示させたいのですが少数がずれていってしまうため出力が異なってしまいます。
この問題が浮動小数点数は、有限のビット数で実数を表現するため、厳密な値を表現することができないためであるということはなんとなく分かったのですが、実際にどのように少数の処理を行えばいいのか分からず困っています。
該当のソースコード
python
1G = int(input()) 2 3u,a,b = map(int,input().split()) 4 5k = int(input()) 6 7usagi = 0 8kame = 0 9 10usagi_kyori = 0 11usagi_rest = 0 12 13 14while True: 15 if usagi >= G and kame >= G: 16 print("DRAW") 17 break 18 elif usagi >= G > kame: 19 print("USAGI") 20 break 21 elif kame >= G > usagi: 22 print("KAME") 23 break 24 else: 25 26 kame += 1 / k 27 28 if usagi_rest == 0: 29 usagi += 1 / u 30 usagi_kyori += 1 / u 31 32 if a <= usagi_kyori: 33 usagi_rest = b 34 usagi_kyori = 0 35 else: 36 usagi_rest -= 1 37 38 print(usagi,kame) #今回起きている問題を明確にするための文です。(本来は不要)
試したこと
def my_round(val, digit=0):
p = 10 ** digit
return (val * p * 2 + 1) // 2 / p
こういった自作関数で処理しようとしたのですが、よく分からずうまくいきませんでした。
入力例の
10
1 1 10
10
は、どのような数字なのでしょうか。
そして、その場合、どのような結果が出力されることを期待しているのでしょうか。
説明が不足しており、申し訳ないです。
1行目はゴールまでの距離G(10キロ)
2行目はうさぎが1キロを走る時間u(分)、またaキロを走る毎にb分の休憩をとることを表します。
3行目はかめが1キロを走る時間k(分)
出力としては先にゴールしたほうを出力しますが同着の場合はDRAWとします。
今回はこのDRAWの場合の入力値想定していますが、1分毎に進む距離を計算していくとズレが発生してしまうというところが問題となっています。
これは、浮動小数点で行うには、無理があります。
あなたのアルゴリズムをそのまま、採用する場合は、正確な値を保持するために、
分数形式で変数を保持する必要があります。
例 2/11 を11回加算して、2になることを期待するような場合です。
このようなケースでは、有理数型の値で変数を保持します。
https://python.atelierkobato.com/fraction/
https://docs.python.org/ja/3/library/fractions.html
回答欄に有理数型を使用した方法を書きます。
回答3件
あなたの回答
tips
プレビュー