Fukcja EXP zwraca błędne wyniki

Odpowiedz Nowy wątek
2006-12-07 19:01
0

Witam,

mam oto taki problem, napisałem taką funkcję:

A:=(EXP(n*ln(1+i)))-1

Problem w tym, że dla wartości n=300 oraz i=0,0058 zwraca mi wynik 4,72541820930 a tymczasem obliczenia na kalkulatorze dają 4,668777164. Dzieje się tak dla dużych wartości "n" oraz małych "i" (tak jak w podanym przykładzie). Co może być nie tak? Czy trzeba gdzieś wstawić jakieś dyrektywy czy jak? Szukałem na forum, ale nigdzie nie znalazłem takiego przypadku, w pomocy Delphi też niczego się nie doszukałem.

Z góry dzięki.

Pozostało 580 znaków

2006-12-07 19:13
0

Jakiego typu zmienne zadeklarowałeś?

Pozostało 580 znaków

2006-12-07 19:27
0

Dałem real dla wszystkich, a wyniki wyrzucam za pomocą FormatFloat.

Pozostało 580 znaków

2006-12-07 19:33
0

Jeśli piszesz w Delphi/FPC, to real == single (4 bajty)
inny typ, to double (8 bajtów) i najdokładniejszy ze zmiennoprzecinkowych: extended (10 bajtów).
Zmiana typów z Real na Extended, powinna poprawić wyniki w znaczący sposób.

Pozostało 580 znaków

2006-12-07 20:20
0

Próbowałem w Delphi6 i TurboDelphi
Niezależnie od typu Single, Real, Extended otrzymuję zawsze prawidłowy wynik.

Pozostało 580 znaków

2006-12-07 21:36
0

Wszystkie zmienne są typu real. Dałem teraz extended i nic. Dalej to samo. Mam Delphi 7. Walczę dalej.

Pozostało 580 znaków

2006-12-07 21:44
0

Może źle piszesz kod...

Pozostało 580 znaków

2006-12-07 23:54
0

Delphi7 - Pusta aplikacja, jeden przycisk z akcją:

Caption:=FloatToStr((EXP(300*ln(1+0.0058)))-1);

Otrzymany wynik: 4,66877716379045

Oczywiście poniższy kod, tak jak tego można się spodziewać, też daje ten wynik:

var n,i:extended;
begin
n:=300;
i:=0.0058;
Edit1.Text:=FloatToStr((EXP(n*ln(1+i)))-1);
end;

<font color="red">Konto porzucone</span>

Dzięki wszystkim forumowiczom za lata wspólnych dyskusji; miłej zabawy w programowanie!
Sławomir 'Szczawik' Włodkowski

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0