#68 Article 5693 Posted at 1994/12/12 09:06:28 by C3KO (MAP5140) [NEWSPAPER]
Subject: Re:*7 パソコン報道 (Re: 危うしペンタ) /5678 ........ /5527 /5522
え~、BASIC上でのまるめ誤差の言い出しっぺのC3KOですが >10 DEFSNG S '単精度 >20 DEFDBL D '倍精度 >30 DEFINT I '整数型 >40 S=10.9:D=10.9:I=10.9 >50 PRINT "S",S,INT(S*10)/10 >60 PRINT "D",D,INT(D*10)/10 >70 PRINT "I",I,INT(I*10)/10 > >S 10.9 10.9 >D 10.89999961853027 10.8 >I 11 11 <-そりゃそうだわなぁ(笑) との件ですが (^_^)ゴカイサレタミタイナノデ もし、倍精度型に正しい結果を求めるのなら、代入する値も倍精度でなければ問題 です。つまり、10.9と単に記すと(BASICにもよりけりですが)普通単精度と見な されます。単精度の 10.9 は、有効桁数7桁までみるかぎり 10.9 であればいいので (というか、そうするしかない)、有効桁数16桁の倍精度では変な値に なってしまうのです。実際に四捨五入してみてください。整数部ですでに2桁です。 また単精度の値を倍精度変数に代入するには、本当は CDBL という関数を使って 代入します。 誤差を防ぐ為には上のプログラムでは 40 S=10.9:D=10.9#:I=10.9 又は 40 S=10.9:D=CDBL(10.9):I=10.9 とすればいいのです。(# は倍精度実数の実値をあらわす記号) この問題は、EPSONだからとか、NECだからとかではありません。某M社がかつて 販売したBASICの仕様(のはず)です。 こまるのは、同じ精度の値なのに、結果が異なる場合です。コレハコマルゾ(^_^) ちなみに、Cでは、double の型のもう一つ上、long double があります。とくに丸め 処理が気になるような部分でなければ、long double を用いると結構誤差がでにくく なります。 Cでは警告とかばんばん出てくる問題が、BASICインタプリタ・コンパイラでは普通に動く 「ふり」をするのが恐いです。もっともCでも奇々怪々なエラーは発生しますが。 なんか、Pentium の話とは時空(時間と空間)を超えた話ですね。(^_^;) 私は数百万種類の言語が...(うそ) C3KO