[Delphi] Sinus i cosinus inaczej!

0

Oto funkcja, którą przerobiłem z pewnego szeregu na Sinus dowolnego argumentu:

FUNCTION Sinus(k:Currency):Currency;

BEGIN
RESULT:=k - ((kkk)/(123)) + ((kkkkk)/(12345)) - ((kkkkkkk)/(1234567)) + ((kkkkkkkkk)/(123456789));
END;

Jak widać, jest to szereg z ciągle zwiększającą się potęgą i silnią - łatwo zauważyć -zatem każdy samemu może zwiększyć jej dokładność.

Po co takie coś? - a nuż gdzieś nie można zastosować "sinusa", to jak znalazł. Zresztą nie wiem, czy każdy język ma funckje trygonometryczne, bo jeśli nie - to już ma:))

"K" jest argumentem sinusa wyrażony w radianach. (Np. Pi/2 to 1,57). Testowałem tę funkcję dla różnych kątów i okazało się, że mi się idało wyśmienicie, bo:

  • rzeczywiście zwraca wartość sinusa podanego kąta, ale....

...ale nie działa dla kątów dużych. Już przy kącie 6,28 (2*Pi), miałem dziwne wyniki, dla małych kątów natomiast - wyśmienicie.

Czy ktoś wie jak przerobić tę funkcję, żeby działała prawidłowo?

PS: A tu funkcja dla Cosinusa :

FUNCTION Cosinus(k:Currency):Currency;

BEGIN
RESULT:=1 - ((kk)/(12)) + ((kkkk)/(1234)) - ((kkkkkk)/(123456)) + ((kkkkkkkk)/(12345678)) - ((kkkkkkkkkk)/(12345678910));
END;

Usterki zanotowałem te same co w pierwszej. Proszę o opinię - czy mam coś źle (męczyłem się trochę nad tą funkcją - nie ma co.... :)

0

nie wiem, czy ma to jakieś znaczenie, ale dlaczego stosujesz typ Currency (pienieżny!!)?

0


FUNCTION TForm1.Sinus(k:Currency):Currency;
var
C, wynik : Currency;
I : Integer;
BEGIN
I := 0;
while k>=(23.141592) do k := k-2(3.141592);
C := k;
while C>=(3.141592/2) do
begin
Inc(I);
C := C-(3.141592/2);
end;
case I of
0 :
Result := k - ((kkk)/(123)) + ((kkkkk)/(12345)) - ((kkkkkkk)/(1234567)) + ((kkkkkkkkk)/(123456789));
1 :
begin
k := 3.141592-(k-(3.141592));
Result := k - ((kkk)/(123)) + ((kkkkk)/(12345)) - ((kkkkkkk)/(1234567)) + ((kkkkkkkkk)/(123456789));
end;
2 :
begin
k := k - 3.141592;
Result := k - ((kkk)/(123)) + ((kkkkk)/(12345)) - ((kkkkkkk)/(1234567)) + ((kkkkkkkkk)/(123456789));
end;
3 :
begin
k := k - 3.141592;
k := 3.141592-(k-(3.141592));
Result := k - ((kkk)/(123)) + ((kkkkk)/(12345)) - ((kkkkkkk)/(1234567)) + ((kkkkkkkkk)/(123456789));
end;
end;
END;

zamiast Pi pisalem 3.141592, poniewaz skoro ten domniemany program nie ma funkcji sin to pewnie tez nie ma liczby Pi;)

0

Przecież to jest zwykłe rozwinięcie funcji w szereg potęgowy. Błędne obliczenia otrzymujesz ponieważ używasz skończonej (czytaj za małej) dokładności. Szereg powinien być nieskończony :)

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