裏 RjpWiki

文字通り,RjpWiki の裏を行きます
R プログラム コンピュータ・サイエンス 統計学

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

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

中澤さんからのコメントがありました。ありがとうございます。

> library(Rmpfr)
> as.integer(log(mpfr(16677181699666574,100))/log(mpfr(3,100)))

が正しく 34 になるとの指摘があった。その通りではあるが,正確に言えば

> as.integer(log(mpfr("16677181699666574",100))/log(mpfr(3,100)))

double の精度を超える数値を mpfr するには,文字型で与えないといけないようだ。

> prec = 100;log(mpfr(16677181699666569,prec))/log(mpfr(3,prec))
1 'mpfr' number of precision  100   bits 
[1] 33.999999999999999945420080981413 # 誤差あり

> prec = 100;log(mpfr("16677181699666569",prec))/log(mpfr(3,prec))
1 'mpfr' number of precision  100   bits 
[1] 34 # 3 の 34 乗は正確に 16677181699666569

コメント (1)

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

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)

学術会議任命拒否問題

2020年10月24日 | 雑感

右派,左派,中立とも,いろいろ言いたいこともあるんでしょうが,どうでしょうねえ?

いっそのこと,すでに任命さている今までの105人も辞任する。また,今回無事に任命された99人ですか?の全員も任命を辞退する。

それならばと政府が要請しても,学術会議は新たな任命者の推薦も行わない。たとえ何らかの筋で任命されても,対象者は任命に応じない。

どうせ,任命されても金銭的なメリットはほとんどないようだし(名誉職?),政府に尾っぽを振ったと言われるのは心外でしょう。

それでも残った任命候補者はそれこそ「御用学者」の汚名(?)を甘受する(喜んで受け入れる)人たちでしょうから,誰も賞賛したりしないでしょう。

その人たちに注がれる国費(税)こそ「無駄金」でしょう。

コメント