Это гарантировано стандартом C ++, что angle == std::acos(std::cos(angle))
если angle
находится в диапазоне [0, Pi], или другими словами, возможно ли восстановить точное первоначальное значение angle
из результата std::cos
с помощью std::acos
учитывая указанный предел диапазона?
Предельные случаи, когда angle
является infinity
или же NaN
опущены.
Ответ StoryTeller:
Стандарт не может дать такую гарантию просто потому, что результат
std::cos
не может быть представлен точноdouble
, так что вы получите ошибку усечения, которая повлияет на результатstd::acos
,
С cppreference.com:
» Если ошибок не возникает, [acos возвращает] арккосинус arg (arccos (arg)) в диапазоне [0; π]
В градусах это от 0 до 180 включительно, что соответствует значениям косинуса от 1 до -1 включительно.
За пределами этого диапазона вы даже не можете получить приблизительную корреспонденцию. Вычисление косинуса выброс рыбы информация о том, какой угол у вас был за пределами этого диапазона. Нет никакой возможности вернуть эту информацию.
Как информация отбрасывается:
Во-первых, в градусах cos (x) = cos (K * 360 + x) для произвольного целого числа K. Во-вторых, cos (x) = cos (-x). Это приводит к огромному количеству угловых значений, которые дают одинаковое значение косинуса.
Кроме того, хотя все читатели, вероятно, знают это, но для полноты: поскольку синусы — это косинусы — это очень иррациональные числа, обычно не простые дроби, вы не можете ожидать точных результатов, за исключением, возможно, косинуса 1, что соответствует 0 градусам.
Согласно стандарту:
Настоящий международный стандарт не предъявляет никаких требований к точности
операций с плавающей точкой; см. также 18.3.2. — конец примечания]
http://open-std.org/JTC1/SC22/WG21/docs/papers/2016/n4606.pdf
Даже математически это невозможно. Например, cos(2*PI)
0, но тоже cos(4*PI)
,