2010-09-17 8 views
17

Czy istnieje bardziej stabilna implementacja funkcji cotangens niż return 1.0/tan (x) ;?Stabilny Cotangent

+0

Zakładam, że masz problem z 1/tan jest to, że jego niezdefiniowane na pi/2, gdy funkcja powinna zwrócić zero? – MerickOWA

+0

Wykonanie inwersji jest podejrzane, gdy zbliżamy się do pi/2 tak ... Zastanawiałem się, czy istnieje lepszy sposób na zrobienie tego. –

Odpowiedz

36

cot(x) = cos(x)/sin(x) powinna być bardziej stabilna numerycznie blisko π/2 niż cot(x) = 1/tan(x). Możesz to efektywnie zaimplementować przy użyciu sincos na platformach, które go mają.

Inną możliwością jest cot(x) = tan(M_PI_2 - x). Powinno to być szybsze niż powyższe (nawet jeśli dostępne jest sincos), ale może być również mniej dokładne, ponieważ M_PI_2 jest oczywiście tylko przybliżeniem liczby transcendentalnej π/2, więc różnica M_PI_2 - x nie będzie dokładna w pełni szerokość mantysy double - w rzeczywistości, jeśli masz pecha, może mieć tylko kilka znaczących bitów.

+0

Ok. Sądzę, że to jest najlepsze, co mogę zrobić. Dowiedziałem się także o sincosie, które muszę przyznać, że nigdy wcześniej się nie spotkałem! –

+2

Właśnie przypomniałem sobie tożsamość trig, która pozwala ci zrobić znacznie lepiej i zredagować moją odpowiedź. – zwol

+4

+1. Zdecydowanie użyj tan (pi/2 - x). –