![]() |
Добро пожаловать, гость ( Вход | Регистрация )
![]() |
snav |
![]()
Сообщение
#1
|
Kорифей ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 4 135 Регистрация: 13.4.2008 Из: Россия Пользователь №: 7 457 ![]() |
Ребят, возникла такая задача на работе: нужно научиться вычислять тригонометрические функции с высокой точностью. В стандартном 8-байтном типе double слишком мало разрядов, поэтому библиотечные функции не годятся. Хочу использовать 16-байтный тип decimal в .NET. Функции Sin, Cos, Tan, Atan уже написал, используя разложение в степенные ряды. Осталось придумать, как запрограммировать арксинус и арккосинус.
Стандартный степенной ряд arcsin(x) = x + 1/6 * x^3 + 3/40 * x^5 +... сходится более менее быстро только при |x| < 1/2. А при |x| > 1/2 скорость сходимости резко падает. Сейчас вычисляю арксинус через численное решение уравнения sin(x)=a, но это очень медленно. Чтобы придумать для быстрого вычисления в диапазоне |x| > 1/2? Может быть, выполнить какое-то математическое преобразование, чтобы от вычисления арксинуса в области |x| > 1/2 перейти к вычислению арксинуса в области |x| < 1/2. Но преобразование не должно приводить к существенной потере точности. |
![]() ![]() |
snav |
![]()
Сообщение
#2
|
Kорифей ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 4 135 Регистрация: 13.4.2008 Из: Россия Пользователь №: 7 457 ![]() |
Да, корни - это не очень хорошо. Для вычисления корней есть итерационный алгоритм, но, скорее всего, он будет работать достаточно медленно. И сложно сказать, как возведение в квадрат с последующием извлечением корня отразится на точности результата.
|
![]() ![]() |
![]() |
Упрощённая версия | Сейчас: 19.7.2025, 9:59 |