裏 RjpWiki

Julia ときどき R, Python によるコンピュータプログラム,コンピュータ・サイエンス,統計学

数値計算の落とし穴(非常に希なケース?)

2020年10月26日 | ブログラミング

16677181699666574 >= 3**x を満たす最大の整数 x を求めようとして,両辺の log をとって
log(16677181699666574) >= x * log(3)
(log(16677181699666574) / log(3)) の整数部 = x

Python で

>>> import math

>>> math.log(16677181699666574) /math.log(3)
33.99999999999999
>>> int(math.log(16677181699666574) /math.log(3))
33

しかし,それは明らかに間違い
3**33 =  5559060566555523
3**34 = 16677181699666569 < 16677181699666574 
本当は,x は 34 だ

R でも,同じように間違った答えになる。

> options(digits=16)
> log(16677181699666574) / log(3)
[1] 33.99999999999999
> as.integer(log(16677181699666574) / log(3))
[1] 33

コメント (1)    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« 学術会議任命拒否問題 | トップ | 数値計算の落とし穴(非常に... »
最新の画像もっと見る

1 コメント

コメント日が  古い順  |   新しい順
Unknown (中澤)
2020-10-27 15:02:30
digitsは表示桁数の指定だけで計算の有効数字は変わらないので。
library(Rmpfr)
as.integer(log(mpfr(16677181699666574,100))/log(mpfr(3,100)))
だとちゃんと34になります
ご存じとは思いますが念のため
返信する

コメントを投稿

ブログラミング」カテゴリの最新記事