Как стать автором
Обновить

Отсутствие в .NET важных тригонометрических функций: заполняем пробелы

Уровень сложностиПростой
Время на прочтение4 мин
Количество просмотров4.7K

.NET включает базовые тригонометрические функции (sin, cos, tan, asin, acos, atan) и их гиперболические аналоги (sinh, cosh, tanh, asinh, acosh, atanh) в классе Math. Однако в .NET отсутствуют следующие тригонометрические функции:

  • Sec (секанс)

  • Csc (косеканс)

  • Cot (котангенс)

  • Asec (обратный секанс)

  • Acsc (обратный косеканс)

  • Acot (обратный котангенс)

  • Sech (гиперболический секанс)

  • Csch (гиперболический косеканс)

  • Coth (гиперболический котангенс)

  • Asech (обратный гиперболический секанс)

  • Acsch (обратный гиперболический косеканс)

  • Acoth (обратный гиперболический котангенс)

Это упущение может быть неудобным для разработчиков, особенно тех, кто работает в таких областях, как компьютерная графика, обработка сигналов и научные вычисления, где важны точные тригонометрические расчеты.

Например, в компьютерной графике функция арккотангенса часто используется для вычисления углов при вращении и отражении объектов. Без прямой реализации разработчикам приходится выводить её с использованием других функций, что может приводить к неэффективности и потенциальным ошибкам, как показано ниже.

Я считаю, что современный язык программирования, предназначенный для решения научных задач, должен предлагать полный набор математических инструментов для облегчения точных и эффективных вычислений. Чтобы заполнить пробелы в математических функциях .NET, я разработал библиотеку, включающую недостающие тригонометрические функции, назвав ее MathTrigonometric. Вы можете найти библиотеку и её документацию на GitHub.

Зачем использовать эту библиотеку?

  1. Функция арккотангенса (arccot)

Функция арккотангенса является одной из наиболее спорных тригонометрических функций из-за её двойных графических представлений. Оба графика математически правильны, но один из них предпочтительнее из-за согласованности и ясности.

Предпочтительный диапазон для arccot(x) составляет (0, π), а не (−π/2, π/2).
Предпочтительный диапазон для arccot(x) составляет (0, π), а не (−π/2, π/2).

С математической точки зрения, функция арккотангенса arccot(x) обычно определяется как угол, чей котангенс равен x. Предпочтительный диапазон для arccot(x) составляет (0, π), а не (−π/2, π/2), так как он сохраняет согласованность с другими обратными тригонометрическими функциями. Вот реализация функции arccot с использованием существующей функции 'Math.Atan' в C#:

public static double Acot(double d)
{
    return Math.Atan(1.0 / d);
}

Эта реализация не учитывает правильный диапазон функции арккотангенса, что приводит к неточным результатам для отрицательных входных значений. Вот правильная реализация, применяющая свойство симметрии arccot(−x) = π − arccot(x) для отрицательных входных значений:

public static double Acot(double d)
{
    //the Trigonometric Symmetry is applied: arccot(−x) = π − arccot(x)
    if (IsNegative(d))
        return Math.PI - Math.Atan(1 / -d);

    return Math.Atan(1.0 / d);
}

Математики предпочитают правильную реализацию, так как она придерживается стандартного диапазона (0, π), обеспечивая согласованность и избегая неоднозначностей в расчетах.

  1. Повышение точности

Функция обратного гиперболического косеканса определяется как:

Arcsch(x) = ln[1/x + √(1/(x^2) + 1)]

При вычислении этой функции для двух противоположных входных значений, таких как -0.1E-7 и 0.1E-7, получаем 19.1138 для x = 0.1E-7 и -∞ для x = -0.1E-7.

Для значений, близких к нулю, относительная ошибка (т.е. ошибка относительно фактического значения) может быть значительной. Это связано с тем, что расстояние между представимыми числами с плавающей запятой не является равномерным. По мере приближения чисел к нулю расстояние между ними уменьшается в абсолютных величинах, но увеличивается в относительных, что приводит к заметным ошибкам при выполнении арифметических операций или математических функций, таких как логарифмы.

Чтобы уменьшить эти ошибки, можно использовать свойство симметрии функции обратного гиперболического косеканса: arcsch(−x) = −arcsch(x). Применяя это свойство для отрицательных входных значений, можно избежать вычислений значений, близких к нулю, и тем самым повысить точность результатов.

Пример:

public static double Acsch(double x)
{
    if (x == 0.0)
        return double.NaN;

    //the Trigonometric Symmetry is applied: arcsch(−x)=−arcsch(x)
    if (IsNegative(x))
        return -Math.Log(1.0 / -x + Math.Sqrt(1.0 / (x * x) + 1.0));

    return Math.Log(1.0 / x + Math.Sqrt(1.0 / (x * x) + 1.0));
}
  1. Обеспечение диапазонов входных и выходных значений

Тригонометрические функции часто требуют специфических диапазонов входных значений для получения допустимых результатов. Например, функция обратного гиперболического секанса arsech(x) принимает значения только в диапазоне (0, 1]. При реализации пользовательских тригонометрических функций важно проверять диапазоны входных значений, чтобы предотвратить ошибки выполнения и обеспечить точные вычисления.

Пример:

public static double Asech(double x)
{
    if (x is <= 0.0 or > 1.0)
        return double.NaN;

    return Math.Log(1.0 / x + Math.Sqrt(1.0 / (x * x) - 1.0));
}

Заключение

Включение недостающих тригонометрических функций имеет важное значение для полноты современного языка программирования, такого как .NET. Как разработчикам, нам необходимо учитывать точность, диапазон и симметрию при реализации этих функций. Моя библиотека нацелена на заполнение этих пробелов и предоставление надежных реализаций для научных вычислений.

Чтобы установить библиотеку, используйте следующую команду в консоли NuGet Package Manager:

Install-Package MathTrigonometric

Я также работаю над библиотекой .NET для быстрого вычисления сложных научных математических формул, что значительно улучшит возможности C#. Вы можете поддержать мои усилия, став спонсором на GitHub. Ваши взносы помогут развитию open-source и улучшению инструментов, доступных для сообщества.

Спасибо! Пожалуйста, оставляйте идеи в комментариях!

Теги:
Хабы:
Всего голосов 17: ↑13 и ↓4+12
Комментарии19

Публикации