不正な浮動小数点

解決


MolMol  2005-09-28 19:35:51  No: 17746

Delphi初心者です。

プログラムを組んで、コンパイルまではできたのですが、「不正な浮動小数点演算」により実行時エラーが生じてしまいます。しかも、ステップ実行でみてみると、For i := 1 to N doの部分(i,Nは勿論Integer)でとまっています。

どうすればよいのか、検討がつきません。


地獄の魔人  2005-09-28 20:18:22  No: 17747

回答側でも見当(検討じゃないよ)がつきません。
これだけの情報で回答できたらすごいですね。
質問でしょうか?それともコメント(独り言)なんでしょうか?

エラーは ループでおこっているんじゃない。
現場(演算部分で)でおこっているんだ!(古ッ!)

今いえることはエラーの起こっている場所を把握し、
「浮動小数点演算を正しくしてください」としか回答できません。


MolMol  2005-09-28 20:30:25  No: 17748

>>地獄の魔人さん

独り言でも冗談でもないです。

現場(演算部分)とは、何をしめすのですか?
作成したProcedureの中身のことですか?


deldel  2005-09-28 20:31:28  No: 17749

問題のコードを書いた方が良いですね。


MolMol  2005-09-28 20:56:42  No: 17750

<ここです>  for NTime := 1 to NTimeMx do
  begin
      force (N, L, RC, Switch) ;
      CC0 := 1.0 / K;
      CC1 := 1.0;
      for j := 1 to N do
      begin
        if j = NA + 1 then
        begin CC1 := CC0; end;
      RXI := 2.0 * RX[j] - RXO[j] + FX[j] * HSQ * CC1;
      RYI := 2.0 * RY[j] - RYO[j] + FX[j] * HSQ * CC1;
      RXO[j] := RX[j] ;
      RYO[j] := RY[j] ;
      RX[j]  := RXI ;
      RY[j] :=  RYI ;
      end;
  if (NTime mod NPrint) = 0 then
    begin
      Time := H * Ntime ;
      PrintOut (N, NA, Time, Np);
    end;
  if (NTime mod NGraph) = 0 then
    begin
      NOPT := NOPT + 1;
      writeln(Fout,NOPT:4) ;
      Write(fout,N) ;
      Write(fout,NA) ;
      write(fout,NB) ;
      write(fout,L) ;
      s := H * NTime;
      write(Fout, S) ;

     for q := 1 to N do
     begin
      if q < NA then
      begin R := 1;  end
      else if q >= NA then
      begin R := 1.5; end;
      writeln(Fout, q);
      writeln(Fout, R);
      writeln(Fout, RX[q]);
      writeln(Fout, RY[q]);
     end;

が、問題のコードです(だとおもいます…)。


deldel  2005-09-28 21:00:04  No: 17751

全ての変数の宣言が欲しいですね・・・


MolMol  2005-09-28 21:03:37  No: 17752

implementation

const
   pi = 3.141592653589793;
   NN = 80;
   NRanMx = 50000;
   T = 5.0;
   K = 10.0;
   NA = 20;
   NB = NA;
   H = 0.001;
   RC = 3.0 ;
   N = NA + NB  ;
   NDENS = 0.1 ;
   HSQ = H*H;
   NP = 9;
   NTimeMx = 10000;
   NPrint = 1000;
   NGraph = 2000;
   L = 20;
var
   RX, RY, RXO, RYO: array [1..NN] of real;{position of molecular}
   FX, FY, VELX, VELY : array  [1..NN] of real ;
   Ran : array [1..NRanMx] of real ;
   NRan, IX : integer;
   Switch, Nopt : integer;
   CC0, CC1,RXI, RYI, Time,R : real;

で、ローカル変数は、

var i,j,q: integer;
    NTime : Integer;
    fout : TextFile;
    FName : String;
    s : real;

です。

この段階では、Switchは10です。

ながながとすみません。


地獄の魔人  2005-09-28 21:24:13  No: 17753

>For i := 1 to N doの部分(i,Nは勿論Integer)でとまっています。
どこ?


MolMol  2005-09-28 21:26:36  No: 17754

地獄の魔人さん

for NTime := 1 to NTimeMx doです。


deldel  2005-09-28 21:48:04  No: 17755

「force」って何でしょうか?


MolMol  2005-09-28 22:01:35  No: 17756

>>deldel さん

Forceはprocedureです。
Force(N : integer; L, RC : real; Switch : integer;)


ヨーダ  2005-09-28 22:01:59  No: 17757

>「force」って何でしょうか?

forceそれは力じゃよ
ってトレースのやり方はご存知かな?


MolMol  2005-09-28 22:11:31  No: 17758

>>ヨーダさん

しりませんでした…。

みなさんお時間とらせてすみませんでした。
もうすこし自分でやってみます。


地獄の魔人  2005-09-28 22:15:36  No: 17759

>ステップ実行でみてみると、
>For i := 1 to N doの部分(i,Nは勿論Integer)でとまっています。
ステップ実行はエラーが出た後の行でとまるから、
問題はこれ以前にあるはず。

ソース見る限りでは、抜き出しているみたいだから
For i := 1 to N do  〜
のソースがないと回答できません。


MolMol  2005-09-28 23:20:47  No: 17760

>>地獄の魔人さん

>ステップ実行はエラーが出た後の行でとまるから、
>問題はこれ以前にあるはず。

しりませんでした。コードを最初から一行ずつ検証しなおします。
ありがとうございました。


deldel  2005-09-29 17:47:13  No: 17761

for NTime := 1 to NTimeMx do
ここでブレークポイントを作成し(F5を押す)、
実行し、止まった後、F7キーを押していくと、
きっとエラー箇所が見つかると思います。


地獄の魔人  2005-09-29 19:47:12  No: 17762

>for NTime := 1 to NTimeMx do
>ここでブレークポイントを作成し(F5を押す)、
>実行し、止まった後、F7キーを押していくと、
>きっとエラー箇所が見つかると思います。

[for NTime := 1 to NTimeMx do] で、
エラー停止しているって書いてるやん
こんなところにブレークポイントいれても無駄やん!!
ブレークポイントいれやんでもとまるでぇ!

入れるのはこの行の処理よりも前や!


deldel  2005-09-29 20:21:31  No: 17763

ありゃ・・・ごめんなさい^^;


メラトニン  2005-09-29 22:23:56  No: 17764

試してみました、
結果、for ループ中のForce,PrintOutもしくはファイルIOが原因です。
しかし、この中身についてはMolMolさんは隠蔽していますので、これ以上は分かりません。

ちなみに、質問するときは、これくらい出せば分かるだろうとくくって問題を小出しにするのではなく、問題の状況を再現できる最小のコードを表示しないと普通は誰も教えてくれませんよ。


地獄の魔人  2005-09-30 19:51:26  No: 17765

まだ、解決できていないのかねぇ

>問題の状況を再現できる最小のコードを表示しないと
>普通は誰も教えてくれませんよ。
そうや!

>結果、for ループ中のForce,PrintOutもしくはファイルIOが原因です。
[for NTime := 1 to NTimeMx do begin]ここでとまってるってことは
Force や PrintOut までは動いとらんやろぉ。
IOエラーが出るのはオープンしとらんハンドルにアクセスするからやで、
コード見る限りでは fout はローカルやさけ、fout のオープンが必要
やし[for NTime := 1 to NTimeMx do begin]の前には
少なくともこれらの初期設定しとる部分とかあるはずや!

>コードを最初から一行ずつ検証しなおします。
問題となるんは直前に実行されている処理内容がわからんからやけど
まぁ、「ステップ実行はエラーが出た後の行でとまる」こと知らんから
その行もしくはその行以降でエラーが出てると勘違いし、
勘違いな部分のソース送ってきたんや。
「最初から一行ずつ検証」やのうて、直前の処理を調べやぁ!


MolMol  2005-09-30 22:36:06  No: 17766

>>地獄の魔人さん
>>deldel 
>>メラトニン

(なんとかですが…)解決しました。
お時間取らせて申し訳ありませんでした。


MolMol  2005-09-30 22:38:25  No: 17767

>>deldelさん
>>メラトニンさん
失礼しました。


メラトニン  2005-09-30 22:44:02  No: 17768

重要な箇所を読み飛ばしていました
●[for NTime := 1 to NTimeMx do begin]
ここでとまってるんですね…
地獄の魔人さんのおっしゃるようにその直前がエラー箇所です。
申し訳ございません。


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

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






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