CPU実験室

誰も見向きもしない古いCPUをいじって動かしてみようというプロジェクトです

演算精度

 

これまでは計算速度ばかり気にしていたのですが、いまさら重大な問題に気付きました。Cで書いたベンチマークは変数をdouble型(倍精度)としていましたがNS32Kアセンブラによるプログラムはaddf、mulfといった単精度グループの命令で書いてしまっていました。微細部分を見るため拡大率を上げるとすぐに桁落ちしてしまいます。

32bit単精度は仮数部のbit数が23なのでLOG(2^23)=6.9 10進の有効桁数約7桁

64bit倍精度は仮数部のbit数が52なのでLOG(2^52)=15.6 10進の有効桁数約15桁

になるはずなので実際にやってみました。・・といってもNS32kボードでやると鬼のように時間がかかるので、ここはホストPCのCPUパワーに任せたシミュレーションです。1枚の画像を得るのに1秒(RTCの分解能なのでおそらく1秒以下)でできてしまいますので。

画像の中心座標は常に実軸:-1.26740983598069、虚軸:0.35552711382890、繰返し回数は8192で1辺の長さ1×1の領域から始まり1個下の画像はそれを10倍に拡大したものになります。ちょうど「POWERS OF TEN」と同じ仕組みです

 

f:id:O3I:20200512075653j:plain

f:id:O3I:20200512075719j:plain

ここまでは単精度も倍精度もかわません。さらに拡大を続けると・・・

 

f:id:O3I:20200512075734j:plain

f:id:O3I:20200512075758j:plain

単精度は10^-5あたりで輪郭がざらざらしてきます。これは計算座標がさらに縦横256に分割しているわけで既に有効桁数7桁の桁落ちが始まってます。10^-6でもうだめです。

ここからは倍精度の独壇場です

f:id:O3I:20200512075811j:plain

f:id:O3I:20200512075825j:plain

 

10^-11でなんか変なジャガイモみたいのが見えてきましたがまだまだ行けます

 

f:id:O3I:20200512075837j:plain

f:id:O3I:20200512075849j:plain

さすがに1辺10^-14で倍精度も限界に達しました