Отсутствие в .NET важных тригонометрических функций: заполняем пробелы
.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.
Зачем использовать эту библиотеку?
Функция арккотангенса (arccot)
Функция арккотангенса является одной из наиболее спорных тригонометрических функций из-за её двойных графических представлений. Оба графика математически правильны, но один из них предпочтительнее из-за согласованности и ясности.
Предпочтительный диапазон для arccot (x) составляет (0, π), а не (−π/2, π/2).
С математической точки зрения, функция арккотангенса arccot (x) обычно определяется как угол, чей котангенс равен x. Предпочтительный диапазон для arccot (x) составляет (0, π), а не (−π/2, π/2), так как он сохраняет согласованность с другими обратными тригонометрическими функциями. Вот реализация функции arccot с использованием существующей функции 'Math.Atan' в C#:
public static double Acot(double d)
{
if (Math.Abs(d) < double.Epsilon)
return Math.PI / 2.0;
return Math.Atan(1.0 / d);
}
Эта реализация не учитывает правильный диапазон функции арккотангенса, что приводит к неточным результатам для отрицательных входных значений. Вот правильная реализация, применяющая свойство симметрии arccot (−x) = π − arccot (x) для отрицательных входных значений:
public static double Acot(double d)
{
if (Math.Abs(d) < double.Epsilon)
return Math.PI / 2.0;
//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, π), обеспечивая согласованность и избегая неоднозначностей в расчетах.
Повышение точности
Функция обратного гиперболического косеканса определяется как:
При вычислении этой функции для двух противоположных входных значений, таких как -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 (Math.Abs(x) < double.Epsilon)
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 / Math.Pow(x, 2.0) + 1.0));
return Math.Log(1.0 / x + Math.Sqrt(1.0 / Math.Pow(x, 2.0) + 1.0));
}
Обеспечение диапазонов входных и выходных значений
Тригонометрические функции часто требуют специфических диапазонов входных значений для получения допустимых результатов. Например, функция обратного гиперболического секанса arsech (x) принимает значения только в диапазоне (0, 1]. При реализации пользовательских тригонометрических функций важно проверять диапазоны входных значений, чтобы предотвратить ошибки выполнения и обеспечить точные вычисления.
Пример:
public static double Asech(double x)
{
if (x is < double.Epsilon or > 1.0)
return double.NaN;
return Math.Log(1.0 / x + Math.Sqrt(1.0 / Math.Pow(x, 2.0) - 1.0));
}
Заключение
Включение недостающих тригонометрических функций имеет важное значение для полноты современного языка программирования, такого как .NET. Как разработчикам, нам необходимо учитывать точность, диапазон и симметрию при реализации этих функций. Моя библиотека нацелена на заполнение этих пробелов и предоставление надежных реализаций для научных вычислений.
Чтобы установить библиотеку, используйте следующую команду в консоли NuGet Package Manager:
Install-Package MathTrigonometric
Я также работаю над библиотекой .NET для быстрого вычисления сложных научных математических формул, что значительно улучшит возможности C#. Вы можете поддержать мои усилия, став спонсором на GitHub. Ваши взносы помогут развитию open-source и улучшению инструментов, доступных для сообщества.
Спасибо! Пожалуйста, оставляйте идеи в комментариях!