Fukcja EXP zwraca błędne wyniki

Fukcja EXP zwraca błędne wyniki
MA
  • Rejestracja: dni
  • Ostatnio: dni
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.

pelsta
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 819
0

Jakiego typu zmienne zadeklarowałeś?

MA
  • Rejestracja: dni
  • Ostatnio: dni
0

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

Pawel200x.5
  • Rejestracja: dni
  • Ostatnio: dni
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.

pelsta
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 819
0

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

MA
  • Rejestracja: dni
  • Ostatnio: dni
0

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

pelsta
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 819
0

Może źle piszesz kod...

SZ
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 3356
0

Delphi7 - Pusta aplikacja, jeden przycisk z akcją:

Kopiuj
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:

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

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.