Страницы

Поиск по вопросам

четверг, 19 декабря 2019 г.

tan и бесконечность

#cpp #math


Может ли tan возвратить бесконечность? При каком значении? pi/2 не возвращает бесконечность
(из за погрешностей, наверно).
    


Ответы

Ответ 1



Нет, tan не может вернуть бесконечность (+Inf или -Inf). Из примечания к описанию tan в cppreference: У функции есть полюса при x = π(1/2 + n), однако существующие реализации чисел с плавающей точкой не могут точно представить π/2, поэтому аргумент никогда не попадает в полюс.

Ответ 2



Похоже, что нет. http://en.cppreference.com/w/cpp/numeric/math/tan If a domain error occurs, an implementation-defined value is returned (NaN where supported) Перевод: в случае выхода значения за рамки допустимого диапазона, возвращаемое значение зависит от реализации (NaN, если поддерживается) Т.е. мы можем получить NaN (насколько я понимаю, это входит в 11-й стандарт), но не inf

Ответ 3



В дополнение к имеющимся правильным ответам: Вот значение, на котором tan перепрыгивает через бесконечность: http://ideone.com/gfyJoD double x = 1.57079632679489666901; // около PI/2 double y = nextafter(x, numeric_limits::max()); // в точности следующее cout << fixed << tan(x) << endl; // 16331239353195370.000000 cout << fixed << tan(y) << endl; // -6218431163823738.000000 (разумеется, данное значение имеет смысл лишь в данной версии рантайма, так что никаких гарантий) Почему же разработчики стандарта решили никогда реально не возвращать бесконечность? Причин здесь две: Точное значение π/2 + n · π не представимо в виде числа типа double (т. к. π иррационально). Даже если тангенс аргумента больше максимального значения double, всё равно округление вниз даст лучшее приближение, чем бесконечная ошибка при округлении до бесконечности! Если даже и возвращать значение «бесконечность», неясно, какую именно (положительную или отрицательную) нужно возвращать. У double нету «просто бесконечности».

Ответ 4



Функция tan, несмотря на наличие тега c++ в вопросе, относится к функциям из библиотеки C. Поэтому и ответ на вопросе логичнее искать в сишном Стандарте. И вот что говорит по этому поводу C99 (ISO/IEC 9899:1999) 7.12.4.7: The tan functions Synopsis #include double tan(double x); float tanf(float x); long double tanl(long double x); Description The tan functions return the tangent of x (measured in radians). Returns The tan functions return tan x. Т.е. пока никакой ясности про бесконечность нет. Просто сказано, что функция возвращает тангенс аргумента, заданного в радианах. Однако далее в приложении F, а точнее в п. F.9.1.7 описаны особые случаи: tan(±0) returns ±0. tan(±∞) returns a NaN and raises the ‘‘invalid’’ floating-point exception. Из чего можно сделать вывод, что функция tan не возвращает ∞. Но может вернуть NaN для ∞ значения аргумента. Другие функции, например log10 для нулевого аргумента, возвращают ∞.

Комментариев нет:

Отправить комментарий