Co do nazwy tematu, nie bardzo wiedziałem jak go sformułować, mam nadzieje, że pasuje. :-P
Otóż zacząłem sobie pisać kalkulator na wzór systemowego MS Kalkulatora. I mam funkcję obliczania silni. Świeci ona swoją prostotą, ale daje w miarę odpowiedni wynik:
function TMainForm.Silnia(n: Integer): Extended;
var
i: Integer;
begin
Result := 1;
for i := 1 to n do
Result := Result * i;
end;
używam jej w taki sposób:
procedure TMainForm.bSilniaClick(Sender: TObject);
begin
MEdit.Text := FloatToStrF
(Silnia(Round(StrToFloat(MEdit.Text))), ffGeneral, 18, 32);
end;
Ale to nie jest problemem, a funkcję i tak będę musiał potem nieco zmodyfikować...
Przechodząc do sedna problemu. Obliczając 24! przy pomocy tej funkcji otrzymuje następujące wyniki:
- używając FloatToStr: 6,20448401733239E23
- używając FloatToStrF: 6,20448401733239439E23.
Zaś w MS Kalkulatorze: 620 448 401 733 239 439 360 000.
Wszystkie wyniki są poprawne, jednakże wolałbym uzyskać ten sam co w systemowym kalkulatorze.
A otrzymuje w najlepszym wypadku 6,20448401733239439E23, czyli 620 448 401 733 239 439 000 000.
Stąd moje pytanie: Jak uzyskać dokładniejszy wynik? Proszę o wskazówki.
620 448 401 733 239 439 000 000
620 448 401 733 239 439 360 000