裏 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でシェアする

PVアクセスランキング にほんブログ村

PVアクセスランキング にほんブログ村