Muszę dokonać pierwiastkowania dużych liczb w Pascalu. Niestety, sqrt w Pascalu działa tylko dla typu Real (tj. 11-12 cyfr), a ja potrzebuję tej funkcji do liczb nawet 15-cyfrowych. Jak to rozwiązać?
Wydaje mi się, że musisz tu już posłużyć się algorytmem Newton'a lub szukaniem przez potęgowanie.
Zobacz: http://www.i-lo.tarnow.pl/edu/inf/alg/zmzf/pages/004.htm
nie wiem czy tak jest ale mozesz sprobowac: (nie wiem czy są w Pascalu double :P ale użyj największego z dostępnych)
function Pierw(Podst:double;Sto:integer):double;
begin
result:= exp( ln(abs(Podst))*(1/Sto));
end;
Cóż.. Real w Pascal/Delphi to to samo co Double (w tych językach oba występują, ale we współczesnych wersjach kompilatorów to synonimy). Największym formatem jest Extended (10 bajtów), ale to format wewnętrzny FPU, więc i tak funkcje obliczeniowe są dostepne maksymalnie dla Real.
Jak chcesz mieć większy zakres to musisz przejść po prostu od wyliczania do wyznaczania metodami algorytmicznymi.
Szczawik napisał(a)
Największym formatem jest Extended (10 bajtów), ale to format wewnętrzny FPU, więc i tak funkcje obliczeniowe są dostepne maksymalnie dla Real.
Eee tam, sprawdzałeś? Extended ma większą precyzję niż double, a że to natywny format danych dla fpu to zupełnie inna sprawa.
Polecam sprawdzić osobiście, że dane Extended przy operacjach innych niż dodawanie i odjemowanie oraz obliczenia FPU na BCD lub Integer są na Extended i Double wykonywane tak samo, z tym, że Extended zajmuje więcej, bo w pozostałych przypadkach FPU ignoruje pozostałe pozycje wpisywane do FPU i wykorzystuje je tylko dla większej dokładności obliczeń wewnętrznych.
Taka jest przynajmniej teoria. [Wzięte z dokumentacji Intela dla FPU w procesorach rodziny Pentium.]
// ok, wierzę na słowo - kolejny bezsens w architekturze procesorów intela - Ł