単純な計算の筈が
Posted: 2005年9月20日(火) 23:35
#N88BASIC
dim i1 as integer
dim a1,a2 as single
dim l1,l2 as long
dim q1,q2 as int64
dim x,y as double
i1=3.14
l1=2^50
a1=1+10^-10
a2=10^-100
q1=2^60+1
q2=q1-2^60
x=a1/0
というプログラムの実行結果です。 (AB_4.10.00)
「デ」はデバッグモード実行、リはリリースコンパイル。
デ リ 正しい結果 備考
i1=3.14 3 3 デは、整数なのに小数以下も代入できている。
l1=112589990684262 0 計算エラー longの最大値(2147483647)より大きい数値が代入された。
a1=1.0000000001 -9 1.0 単精度に代入した時点で情報落ちを起こし1.0となる。
デは、有効7桁以上保持しているし、
リに至っては意味不明。
a2=0 -100 ゼロ 単精度に代入した時点で無限小と判定されゼロとなる。
リの計算結果は意味不明。
q1=約4.6e18 ゼロ 2^60+1(約1.15e18) int64以下の範囲内なので整数で表せるはず。
ついでに、print文はintが相手のときは整数表示できる
筈なのに実数標記 (fortranでいうE変換標記)になっている。
q2=0 約-1.15e18 1 デは桁落ちしている。リはq1がコケているため異常反応。
int64の範囲内なので桁落ちは起こさないはず。
y=永久ループ 0 ゼロ割りエラー これは、勝手にゼロで置き換えないでほしい。
以上のとおり、計算誤差が生じない筈のところで計算誤差が生じたり、
変数の型からして記憶できない筈の値が記憶されていたり、
デバッグモードとリリースモードでまるで違う計算結果が生じたりと、
悲惨な結果になりました。
おそらく、「数値は全て倍精度で計算している」というような大チョンボをやっている可能性が大きい
ものと思われます。
dim i1 as integer
dim a1,a2 as single
dim l1,l2 as long
dim q1,q2 as int64
dim x,y as double
i1=3.14
l1=2^50
a1=1+10^-10
a2=10^-100
q1=2^60+1
q2=q1-2^60
x=a1/0
というプログラムの実行結果です。 (AB_4.10.00)
「デ」はデバッグモード実行、リはリリースコンパイル。
デ リ 正しい結果 備考
i1=3.14 3 3 デは、整数なのに小数以下も代入できている。
l1=112589990684262 0 計算エラー longの最大値(2147483647)より大きい数値が代入された。
a1=1.0000000001 -9 1.0 単精度に代入した時点で情報落ちを起こし1.0となる。
デは、有効7桁以上保持しているし、
リに至っては意味不明。
a2=0 -100 ゼロ 単精度に代入した時点で無限小と判定されゼロとなる。
リの計算結果は意味不明。
q1=約4.6e18 ゼロ 2^60+1(約1.15e18) int64以下の範囲内なので整数で表せるはず。
ついでに、print文はintが相手のときは整数表示できる
筈なのに実数標記 (fortranでいうE変換標記)になっている。
q2=0 約-1.15e18 1 デは桁落ちしている。リはq1がコケているため異常反応。
int64の範囲内なので桁落ちは起こさないはず。
y=永久ループ 0 ゼロ割りエラー これは、勝手にゼロで置き換えないでほしい。
以上のとおり、計算誤差が生じない筈のところで計算誤差が生じたり、
変数の型からして記憶できない筈の値が記憶されていたり、
デバッグモードとリリースモードでまるで違う計算結果が生じたりと、
悲惨な結果になりました。
おそらく、「数値は全て倍精度で計算している」というような大チョンボをやっている可能性が大きい
ものと思われます。