Mi a hiba a programban (Error 207 Invalid floating point operation)?
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.
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.
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).
É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.
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
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!