TL; DR No.
Как правило, при поиске источников неточности следует в первую очередь заботиться о сложениях и вычитаниях, которые могут привести к проблеме вычитания отмены.Умножения и деления, как правило, безвредны для точности, кроме добавления дополнительной ошибки округления, но могут вызывать проблемы из-за переполнения и недостаточного заполнения при промежуточных вычислениях.
Ни один номер машины x
не может быть достаточно близок к кратным от π / 2 довызывает переполнение tan(x)
, поэтому tan(x)
является четко определенным и конечным для всех кодировок с плавающей запятой для любого из форматов с плавающей запятой IEEE-754, и, соответственно, cot(x) = 1.0 / tan(x)
.
Это легко продемонстрировать, выполнив исчерпывающий тест со всеми числовыми кодировками float
, поскольку исчерпывающий тест с использованием double
невозможен, за исключением, возможно, самых больших суперкомпьютеров, существующих на сегодняшний день.
Используя математическую библиотеку с точной реализацией tan()
с максимальной ошибкой ~ = 0,5 ulp , мы обнаруживаем, что при вычислении cot(x) = 1.0 / tan(x)
максимальная ошибка составляет менее 1,5 ulp, где сравнивается дополнительная ошибкаСамому tan()
способствует ошибка округления деления.
Повторение этого исчерпывающего теста для всех float
значений с cot(x) = cos(x) / sin(x)
, где sin()
и cos()
вычисляются с максимальной ошибкойиз ~ = 0.5 ulp, мы находим, что максимальная ошибка в cot()
составляет менее 2.0 ulps, поэтому немного больше.Это легко объяснить наличием трех источников ошибок вместо двух в предыдущей формуле.
Наконец, cot(x) = tan (M_PI_2 - x)
страдает от проблемы вычитания, упомянутой ранее, когда x
близок к M_PI_2, и от проблемычто в арифметике с плавающей точкой конечной точности M_PI_2 - x == M_PI_2
, когда x
достаточно мала по величине.Это может привести к очень большим ошибкам, в результате которых у нас не останется действительных битов.