if 文で実数を比較するには?


うただ  2004-02-27 22:11:59  No: 7400

超初心者です。

var s:single;として
    ---------
    sには値が入っているはずで  sは0以上の値です。

if s<=0 then とすると  エラーがでます。

なぜなのでしょうか?


にしの  2004-02-27 22:24:12  No: 7401

再現しません。
再現するコードを提示してください。

エラーが出るというのも、コンパイルエラーなのか実行時エラーなのか、その内容もわかりません。
わかりやすく書けば、問題は解決すると思います。

それと、「入っているはず」という推測で全て済めば、バグは発生しませんよ。
推測ではなく、確実に入っている、というコードでおためしください。
例えば、

var
  s:single;
begin
  s := 1.5;
  if s <= 0 then
  begin
    ShowMessage('<= 0');
  end
  else
  begin
    ShowMessage('> 0');
  end;
end;

では '> 0'が表示されます。


うただ  2004-02-27 23:45:56  No: 7402

にしの さんありがとうございます。

エラーはデバッガ例外が発生というものです。
’不正な浮動小数点数演算命令’というメッセージBOXが表示されます。
全てでエラーがでるわけではなくて特定の数値(変数に入っているはずの値)を比較した時に発生するようです。
比較変数Sが空っぽの場合はやはりこのようなエラーがでるのでしょうか?
また、変数S(single)が空っぽかどうか知る方法はありますか?


るるとん@K  2004-02-28 00:29:01  No: 7403

>また、変数S(single)が空っぽかどうか知る方法はありますか?
ifで空っぽな場合にダイアログを表示
ってか、デフォルトは0なんじゃないんですか?
>エラーが出るというのも、コンパイルエラーなのか実行時エラーなのか、その内容もわかりません。
Ctrl+F9でコンパイルしてからexeファイルを実行すれば良いのでは?


にしの  2004-02-28 00:29:50  No: 7404

空かどうかを知るよりも、初期値を設定すべきです。
空かどうかは、一応はコンパイル警告を見ればわかります。

さて、不正な浮動小数点数演算命令というエラーですが、もしかしたら
Set8087CW($133f);
を実行しておくことで回避できるかもしれません。
再現できるテストケースが解っているのであれば、このコマンドをFormCreateなどで実行しておいた場合と比較してみてください。


るるとん@K  2004-02-28 00:30:03  No: 7405

>>エラーが出るというのも、コンパイルエラーなのか実行時エラーなのか、その内容もわかりません。
>Ctrl+F9でコンパイルしてからexeファイルを実行すれば良いのでは?
ミスです、にしのさんの発言でした


masayan  2004-02-28 01:08:57  No: 7406

>また、変数S(single)が空っぽかどうか知る方法はありますか?
使えるかどうかわかりませんがisNanという関数があります。
あと、例外が発生しているから単純にtry ... exceptで処理する方法もあります。

try
  if s <= 0 then ...
except
  // エラー時の処理  例えば s := 0; とするとか。
end; 

てな感じです。
S の値をファイルから読み込むとかであればこの方が良いと思います。


masayan  2004-02-28 01:29:36  No: 7407

追伸です。
IsNanで S が不正な値かどうかを判断できます。

var
  s : Single;
  p : PDWORD;
begin
  p := @s;
  p^ := $7F800001; // s に不正値を設定

  if IsNan(s) then
    ShowMessage('s is NaN');
end;

ちなみにif IsNan(s) then ... を if s <= 0 then...にすると例外が発生します。


うただ  2004-02-28 03:04:52  No: 7408

みなさんありがとうございます。

バックアップしておいたソースに書き換えたらエラーが出なくなりました。
同じファイルから S に値をよみこんでテストしましたので
変数  S  に入っている値は正常だと思います。

エラーは  if S<=0 then の部分で本当に発生したのでしょうか?

なんだか不思議です。


太郎衛門  2004-02-28 03:09:46  No: 7409

>エラーは  if S<=0 then の部分で本当に発生したのでしょうか?
コードを載せないと誰もわからないと思うんですが。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加