Pythonの切り上げと天井関数

こつこつAtCoderで精進しています。今日はARC062のAtCoDeerくんと選挙速報をやっていました。

とりあえず解けたつもりで提出したら数ケースWAになったので解説を読みましたが,私の解釈では,解説と同じことをコードに落としているつもりでした。

そこで悪いとは思いつつも,テストケースをのぞかせてもらいました。

するとWAになっているケースの想定解と私の解はそれぞれ以下の通りでした。

999455005490758562
999455005490758230

これを見た感想は「誤差じゃね?」でした。で,誤差が出る可能性があるのは私のコードのこの部分のみ

max(math.ceil(T[i-1]/T[i]),math.ceil(A[i-1]/A[i]))

この部分の解説は本記事の趣旨に反するので詳細は割愛しますが,ざっくりいうと前回の何倍になっているかを整数で取得したかったのでこうしました。この部分を試しにこう書き替えました。

max( ( (T[i-1]+T[i]-1) // T[i] ) ,( (A[i-1]+A[i]-1) // A[i] ) 

定番の切り上げ処理です。※以下は参考

これに書き換えるときちんと通りました(AC!)。

で,気になって少し実験したところ

A = 100000000000000000000000000000000
B = 803245244526342

print((A+B-1)//B)
print(math.ceil(A/B))
print((A+B-1)/B)
print(A/B)

の実行結果は

124494979187792196
124494979187792192
1.244949791877922e+17
1.244949791877922e+17

こうなりました。17桁を超えたあたりから誤差がでるようです。なんでかはわかりません。

どなたか詳しい方教えてくださるととても嬉しいです(参考サイトや文献等も歓迎します)。


この記事が気に入ったらサポートをしてみませんか?