Восстановление точного угла из std :: cos (angle) с помощью std :: acos

Это гарантировано стандартом C ++, что angle == std::acos(std::cos(angle)) если angle находится в диапазоне [0, Pi], или другими словами, возможно ли восстановить точное первоначальное значение angle из результата std::cos с помощью std::acos учитывая указанный предел диапазона?

Предельные случаи, когда angle является infinity или же NaN опущены.

3

Решение

Ответ StoryTeller:

Стандарт не может дать такую ​​гарантию просто потому, что результат std::cos не может быть представлен точно double, так что вы получите ошибку усечения, которая повлияет на результат std::acos,

3

Другие решения

С cppreference.com:

» Если ошибок не возникает, [acos возвращает] арккосинус arg (arccos (arg)) в диапазоне [0; π]

В градусах это от 0 до 180 включительно, что соответствует значениям косинуса от 1 до -1 включительно.

За пределами этого диапазона вы даже не можете получить приблизительную корреспонденцию. Вычисление косинуса выброс рыбы информация о том, какой угол у вас был за пределами этого диапазона. Нет никакой возможности вернуть эту информацию.

Как информация отбрасывается:

Во-первых, в градусах cos (x) = cos (K * 360 + x) для произвольного целого числа K. Во-вторых, cos (x) = cos (-x). Это приводит к огромному количеству угловых значений, которые дают одинаковое значение косинуса.

Кроме того, хотя все читатели, вероятно, знают это, но для полноты: поскольку синусы — это косинусы — это очень иррациональные числа, обычно не простые дроби, вы не можете ожидать точных результатов, за исключением, возможно, косинуса 1, что соответствует 0 градусам.

3

Согласно стандарту:

Настоящий международный стандарт не предъявляет никаких требований к точности
операций с плавающей точкой; см. также 18.3.2. — конец примечания]

http://open-std.org/JTC1/SC22/WG21/docs/papers/2016/n4606.pdf

1

Даже математически это невозможно. Например, cos(2*PI) 0, но тоже cos(4*PI),

0
По вопросам рекламы [email protected]