FIREBIRD 2.5 procedura -količnik ni točno izračunan

Dbase, sql, paradox in vse drugo kar se tiče baz.
Odgovori
dr*no
Prispevkov: 11
Pridružen: 19.07.2013 08:47:29

FIREBIRD 2.5 procedura -količnik ni točno izračunan

Odgovor Napisal/-a dr*no » 04.11.2013 08:20:42

Pozdravljeni.

Uporabljam FIREBIRD 2.5 in imam težavo s pravilnim izračunom količnika pri preprostem deljenju npr. 1/3. Rezultat je zgolj aproksimacija pravega rezultata. Količnik, ki ga dobim je 0,333333343267441 pravilni rezultat pa je 0,333333333333333. Količnik nato uporabim pri nadljevanju izvajanja procedure. Težava pa nastane pri večjih vrednostih, ko prične rezultat odstopati za nekaj decimalk.
Nekaj sem že prebral na spletu vendar ne prave rešitve.

Naredil sem primerjavo z MS SQL 2008.

Koda: Izberi vse

INSERT INTO [TEST].[dbo].[DEC]
           ([DECIMALKE])
     VALUES
           (cast(1 as real)/cast(3 as real))
GO
Rezultat je enak kot v FIREBIRD 0,333333343267441, nato pa ....

Koda: Izberi vse

INSERT INTO [TEST].[dbo].[DEC]
           ([DECIMALKE])
     VALUES
           (cast(1 as float)/cast(3 as float))
GO
Tokrat je količnik pravilno izračunan in sicer 0,333333333333333

Torej kako rešiti zadevo v Firebird RDBMS. Lahko uporabim kateri kol numerični tip, rezulat bo vedno napačen. Poskusil sem Float, Real, Double precision. Rešitev sem našel zgolj tako, da ta del procedure izračunam v delphiju ter tabelo updatam s pravim podatkom, nato pa naslednja procedura uprabi pravilni količnik.

Kaka ideja?

dr*no
Prispevkov: 11
Pridružen: 19.07.2013 08:47:29

Re: FIREBIRD 2.5 procedura -količnik ni točno izračunan

Odgovor Napisal/-a dr*no » 04.11.2013 12:02:48

Še nekaj
Če zaženem select stavek:

Koda: Izberi vse

select cast(1 as decimal(18,9))/cast(3 as decimal(18,9)) from rdb$database
dobim pravilni rezultat 0,333333333333333

Če zadevo vključim v PROCEDURO, je rezultat napačen :?

Lp

Miha-R
Prispevkov: 2155
Pridružen: 14.05.2001 21:29:53

Re: FIREBIRD 2.5 procedura -količnik ni točno izračunan

Odgovor Napisal/-a Miha-R » 04.11.2013 13:28:35

Koda: Izberi vse

SET TERM ^ ;
CREATE OR ALTER PROCEDURE TMP001
  RETURNS (Result decimal(18,9))
AS
BEGIN
  Result = cast(1 as decimal(18,9))/cast(3 as decimal(18,9));
END
^
CREATE OR ALTER PROCEDURE TMP002
  RETURNS (Result double precision)
AS
BEGIN
  Result = cast(1 as float)/cast(3 as float);
END
^
SET TERM ; ^

EXECUTE PROCEDURE TMP001;
EXECUTE PROCEDURE TMP002;
Ne vem, kako testiraš, ampak pri meni (FB 2.5.2.26540, Win) obe zgornji proceduri vrneta pričakovani rezultat, s tem da prva izpiše 0,333333333 (9 decimalk) , druga pa 0,333333333333333 (15 decimalk).
Vedno sem želel napisati prav tak odgovor.

dr*no
Prispevkov: 11
Pridružen: 19.07.2013 08:47:29

Re: FIREBIRD 2.5 procedura -količnik ni točno izračunan

Odgovor Napisal/-a dr*no » 05.11.2013 13:03:30

Najlepša hvala za pomoč. Zanesljivo deluje.

In kaj je bila težava pri meni. Uporabil sem FLOAT tip za variabilo, ki vrne rezultat.

Koda: Izberi vse

SET TERM ^ ;
CREATE OR ALTER PROCEDURE TMP003
  RETURNS (Result FLOAT)
AS
BEGIN
  Result = cast(1 as decimal(18,9))/cast(3 as decimal(18,9));
END
^
EXECUTE PROCEDURE TMP003; Vrne rezultat 0,333333343267441

Še enkrat hvala za pomoč in rešitev.

LP.

Odgovori