裏 RjpWiki

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

見かけの長精度表示

2021年10月08日 | ブログラミング

大変よくできたネタだったのに,投稿主さんが消してしまったので,再現しておく。

Python では,整数は自動的に長精度になるので,もしかしたら正しいのかなと眉に唾して読んだ。

ans = 545783032743912028389476341548725567488.0
print(ans)        # 5.45783032743912e+38 完全な桁を書きたい
intAns = int(ans) # こうすればいい
print(intAns)     # 545783032743912028389476341548725567488

そんなことないだろうと,調べてみた。

545783032743912028389476341548725567488 はかなり特殊な数,
hex(545783032743912028389476341548725567488)
= '0x19a99fd143bee50000000000000000000' のように下位桁が0で,0x19a99fd143bee5 = 7223378293538533 は16桁で64ビット実数でかろうじて表せる整数。

ans の先頭 15 桁とその後に 0,最後に 1 でも,このようなことは成り立たないことがわかる。

ans1 = 545783032743912000000000000000000000001.0
print(ans1)       # 5.45783032743912e+38
intAns1 = int(ans1)
print(intAns1)    # 545783032743912028389476341548725567488

Julia なら,BigInt, BigFloat, big"数値を表す文字列" を使う。

b = 545783032743912000000000000000000000001.0
print(b)          # 5.45783032743912e38
print(BigInt(b))  #  545783032743912028389476341548725567488
b = big"545783032743912000000000000000000000001.0" # 文字列で与える
print(b)          # 5.45783032743912000000000000000000000001e+38
print(BigInt(b))  #  545783032743912000000000000000000000001

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

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

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