Стандарт C, или действительно общий, но ни в коем случае не повсеместный стандарт IEEE754 с плавающей запятой, не дает гарантии точности tan
( Cf sqrt
).Реализация приведет к компромиссу в получении хорошего результата за разумное количество тактов.
В частности, поведение тригонометрической функции вблизи асимптоты особенно непредсказуемо;и это именно тот случай.
Признание того, что ошибка не связана с вашим значением pi (стоит проверить, хотя учтите, что, поскольку pi трансцендентен, он может 'не должно быть точно представлено в любой системе с плавающей запятой), если вы хотите, чтобы хорошо функционирующая функция tan
во всем домене, вам было бы лучше использовать стороннюю математическую библиотеку.
Наконец, обратите внимание, чтов IEEE754 вы могли бы получить более согласованное поведение в отношении асимптоты, если разрешить деление с плавающей запятой иметь дело с полюсом и использовать
double c = cos(x); tan(x) = sqrt(1 / c / c - 1);
Это может быть более численно устойчивым, как IEEE754 определяет деление на ноль.