Kezdőoldal » Számítástechnika » Programozás » Mi a hiba a programban (Error...

Mi a hiba a programban (Error 207 Invalid floating point operation)?

Figyelt kérdés

A program arra a célra szolgál,hogy több determinánst számoljon ki,majd azokat egymással elossza.Mindez működik addig amig egyszerű számok(2,40,120,stb) helyett nem olyan kifejezések vannak mint pl 5.4E-05.Íme a program:

Program detR;

Const

n = 5;


Type

Equation =

Array[1 .. n, 1 .. Succ(n)] Of Double;

matrix =

Array[1 .. n, 1 .. n] Of Double;


Const

a: Equation =

((40, 6.22E+13, 6.091E+26, 1.5886E-09, 1.4501E-19, 97.7266),

(6.22E+13, 6.091E+26, 9.1742E+39, 56.3370, 1.6034E-09, 1.618E+14),

(6.091E+26, 9.174E+39, 6.22E+13, 2.221E+14, 114.66092, 1.6166E+27),

(1.5886E-09, 56.337026, 2.221E+14, 1.4501E-19 , 1.58E-29, 3.7885E-09),

(1.4501E-19, 1.6034E-09, 114.66092, 1.4501E-19, 1.8584E-39, 2.3E-18));



Procedure GetMatrix(wout: Integer;

Var m: matrix);

Var i, j: Integer;

Begin

For i := 1 To n Do

For j := 1 To n Do

If j <> wout Then m[i, j] := a[i, j]

Else m[i, j] := a[i, Succ(n)]

End;


Function Det(a: matrix; n: integer): Double;

Var

i, j, k: Integer; d: Double;

Const

Eps = 10E-6;

Begin

For i := 1 To Pred(n) Do

Begin

If Abs(a[i, i]) < Eps Then

Begin

Det := 0.0; Exit

End;


For j := Succ(i) To n Do

Begin

d := a[j, i] / a[i, i];

For k := i To n Do

a[j, k] := a[j, k] - d * a[i, k];

End;

End;

d := 1.0;

For i := 1 To n Do

d := d * a[i, i];

Det := d

End;


Var

i: Integer;

mx: matrix;

Determ: Double;

begin

GetMatrix(Succ(n), mx);

Determ := Det(mx, n);


For i := 1 To n Do

Begin

GetMatrix(i, mx);

WriteLn( 'A(', i, ') = ', (Det(mx, n) / Determ):7:4 )

End;


readln;

end.


2010. júl. 14. 16:54
 1/5 ejbenjaro ***** válasza:

A program végén az alábbi kódrészletben, ha kiíratod a Determ változód értékét, akkor az gyakorlatilag nullát fog mutatni. Ami pedig nullával való osztást jelent a programodban és ez okozza a hibát szerintem.


Kódrészlet a kiíratással:


GetMatrix(Succ(n), mx);

Determ := Det(mx, n);

Writeln(Determ); {A Determ értéke itt 0.0E+0}


For i := 1 To n Do

Begin

GetMatrix(i, mx);

WriteLn( 'A(', i, ') = ', (Det(mx,n)/Determ):7:4 )

End;


readln;

end.

2010. júl. 14. 20:57
Hasznos számodra ez a válasz?
 2/5 A kérdező kommentje:
Ha a számokat nem normál alakban írom ki,akkor simán elvégzi a műveletet,és ha csak egy két szám van normál alakban akkor is,de ha mind akkor becsődöl.
2010. júl. 14. 22:53
 3/5 ejbenjaro ***** válasza:

Az alábbi feltétel a ciklus végére mindig teljesül a jelenleg megadott mátrix esetén:


Kódrészlet:

If (Abs(a[i, i])) < Eps Then

Begin

Det := 0.0;

Exit;

End;


Itt pedig le van nullázva a függvény visszatérési értéke. Ha a függvényed 0-val tér vissza, akkor az nullával való osztást jelent a programod végén, ami az általad fentebb említett hibához vezet, mivel a programok nem igazáb tolerálják a nullával való osztást. Nem vagyok jó matekból, de ha az EPS konstanst még kisebbre veszed, akkor feltehetően a feltétel nem fog teljesülni és a programod lefut (hogy ebben az esetben a helyes eredmény születik e, az nem tudom, mivel a matematikai alapokkal kissé hadilábon állok).

2010. júl. 15. 14:03
Hasznos számodra ez a válasz?
 4/5 anonim ***** válasza:

Én nem vagyok otthon a Delphiben se a Pascalban (gondolom ez valamelyik a kettő közül), de könnyen előfordulhat, hogy a lebegőpontos osztást nem tudja alapesetben kezelni a futtatókörnyezet (vagy az operációs rendszer). Tehát írnod kellene egy függvényt, amely két lebegőpontos számot oszt (ez nem triviális, olvass utána), mert a hibaüzenet alapján itt a probléma.


[link] itt van egy kis tájékoztató, de ha az osztás algoritmusát nem találod akkor keresgélj a neten.

2010. júl. 15. 14:09
Hasznos számodra ez a válasz?
 5/5 A kérdező kommentje:
Így van!Az EPS értékét vettem sokkal kisebbre és most már lefutott.Köszönöm szépen a válaszokat!
2010. júl. 15. 21:31

Kapcsolódó kérdések:




Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!