鳳鳴は祖父の俳号

日記 メモ そんなの

GNU APL 1.7 インストール挑戦中(3) テストケースの演算精度について

※以下の結果はビルドするときに
export CC=clang ; export CXX=clang++
を実行したものと
export CC=clang ; export CXX=clang++ ; export CFLAGS="-mno-sse"
を実行したときで差がなかった。オプションの指定が違う?

□Format_by_spec.tc.log:

        • > 22 0⍕2⋆70

apl: ⋅⋅⋅1180591620717411500000⋅⋅⋅
ref: ⋅⋅⋅1180591620717411303300⋅⋅⋅

両側型⍕は書式設定 m n⍕数値 で 全体m桁、nは小数点以下の数
22 0⍕2⋆70
1180591620717411500000
期待値は 1180591620717411303300

clisp,sbclにて
(print (expt 2 70))
1180591620717411303424

倍精度演算(sse使用)か拡張倍精度演算(x87使用)かが怪しそうだったので近辺を調べる。

20 0⍕2⋆53
9007199254740992
(print (expt 2 53))
9007199254740992

20 0⍕2⋆54
18014398509481985
(print (expt 2 54))
18014398509481984

結果が奇数なのはおかしい。また、倍精度は仮数部52bit ケチ表現で53bit相当なので倍精度を使用してこの違いが出ているような気がする。
拡張倍精度は仮数部63bit+符号1bitだけど、2の70乗なら余裕でオーバーするはず。
ひょっとしたら丸めモードだろうか?切り捨てになっていれば仮数部は111111... の後表現仕切れない箇所は..000となってしまうはずなので要確認。

□ZZZ0_Standard_20x.tc.log:

        • > 31 0 ⍕ 2⋆100

apl: ⋅⋅⋅1267650600228229500000000000000⋅⋅⋅
ref: ⋅⋅⋅1267650600228229401300000000000⋅⋅⋅

(print (expt 2 100))
1267650600228229401496703205376

同様に2のべき乗なので同じ問題。

追記:MacOSX 10.11.6 Apple LLVM version 8.0.0 (clang-800.0.42.1) だと
Format_by_spec.tc も ZZZ0_Standard_20x.tc も一致している。んんん?


□MatrixInverse.tc.log:

R←3 3ρ1 2 3 2 4 5 3 5 6
Z←⌹R

Rの行列を定義
R
1 2 3
2 4 5
3 5 6

ZはRの逆行列
Z
1 ¯3 2.000000000E0
¯3 3 ¯1.000000000E0
2 ¯1 4.458620281E¯15

以下の記述で整数に直してあるけどこの結果を使っていない。
⌊Z + 1E¯12
1 ¯3 2
¯3 3 ¯1
2 ¯1 0

ここで比較エラー。
R+.×Z
1.000000000E0 ¯3.108624469E¯15 2.273630597E¯15
0.000000000E0 1.000000000E0 8.864091330E¯17
¯1.776356839E¯15 8.881784197E¯16 1.000000000E0

本来やりたかったのはおそらく以下。

R+.× ⌊Z + 1E¯12
1 0 0
0 1 0
0 0 1

ということでこれはテストケースのほうが悪いと思われる。