Как правильно вычислить округленные тригонометрические функции в градусах?
Как я могу определить тригонометрические функции, которые принимают аргументы в градусах вместо обычных радианов, и вычислить правильно округленные результаты для этих аргументов?
Умножение аргумента наM_PI/180.0
перед передачей его соответствующей функции в радианах не работает, т.к.M_PI/180.0
это не π / 180. Раздел 5.5 Руководства по арифметике с плавающей точкой предлагает метод для вычисления правильно округленного произведения аргумента на π / 180, но некоторые аргументы все равно будут такими, что этот продукт будет близок к средней точке между двумя последовательными представимыми числами с плавающей точкой, а затем применение даже правильно округленной функции в радианах может привести к неверному конечному результату.
Две стратегии, которые могут работать в одиночку или в комбинации, используют более высокую точность и использованиеsinpi
,cospi
, tanpi
тригонометрические функции изCRlibmчто посчитать соответственноsin(πx)
, cos(πx)
а такжеtan(πx)
.
Для последней стратегии остается проблема деления на 180, что не является точным для многих аргументов.
Что касается стратегии более высокой точности (умножение аргумента на представление с расширенной точностью π / 180, затем применение функции расширенной точности в радианах), может остаться проблема с «точными» случаями. Теорема, которая утверждает, что единственные рациональные результатыsin
, cos
а такжеtan
для рационального аргумента получены в0
относится только к версиям в радианах. Очевидно, что это не относится к версиям степеней, и если для некоторого ввода x с плавающей запятой sindeg (x) является точно средней точкой между двумя последовательными представимыми числами с плавающей запятой, то никакой промежуточной точности недостаточно для гарантии того, что окончательная результат правильно округлен.