掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
異なる実数型の計算エラーを回避する方法 (ID:5256)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
Halbowさん masayanさん、レス有難うございます 例外については、承知していますし、SingleにDoubleの値を代入するべきでは無いのでしょうが 勘違いの例で質問してしまったようなので、例題のコードを変更します。 T2Ddata=record x,y:double; Check:boolean; end; procedure TForm1.Button1Click(Sender: TObject); var x,y,z:double; A:T2Ddata; begin x:=-1.0; y:=1.0; A:=Call1(x,y); try z:=A.x - A.y; showmessage(floattostr(z)); except showmessage(''); end; end; function Call1(x,y:double):T2Ddata; begin if x * y<0 then begin result.Check:=false; exit; end; result.x:=x * y; end; 原因は、Call1のx、yの戻り値に正確な値が返されていないので z:=A.x - A.y; の所で、オーバーフローのエラーになります。 当然ながら、戻り値A.Checkを検査して処理を進めれば良いのですが このコードを実行した時、2000では問題なく処理されました。 今回、疑問になった実際の関数では、複雑な処理をしているのですが 同様の位置で、エラーになったり通過したりします。 又、上記の実行ファイルを98で行うと、遊動小数点エラーとなり このエラーの場合には、例外処理も実行されません。 そこで新たな質問ですが x,yはrecordの中でDoubleで宣言しているのに、なぜオバーフローの値で初期化されるのでしょうか? 又、98では必ずエラーになるのは、なぜでしょうか?
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.