Неточность угла в радианах

Я написал себе крошечную функцию, которая преобразует угол в радианы:

double toRadians(const double &angle){
    double radianangle = (double)(angle * M_PI) / 180;
    return radianangle;
}

Использование этого работает отлично, однако я обнаружил одну проблему. Быстрый тест показывает, что это не совсем точно, вот что я сделал:

const double angle = 90;
double delta = toRadians(angle);
cout << "delta: " << delta << endl;
cout << "cosinus: " << cos(delta) << endl;
cout << "sinus: " << sin(delta) << endl;

Это дает мне результат:

delta: 1.5708
cosinus: 6.12323e-17
sinus: 1

Хотя в данном случае для пазухи дано правильное значение, очевидно, что что-то идет не так, поскольку cos(Pi/2) должен быть равен 0. Неточность приводит к поломке всего моего графического движка, поэтому я хотел бы найти способ избавиться от него. этого.

Считайте 6.12323e-17 равным 0. Вы имеете дело с double.

DimChtz 21.04.2018 23:54

Я очень сомневаюсь, что несоответствие между 6e-17 и 0 могло «испортить [ваш] графический движок»

jeremyong 21.04.2018 23:58

Проблема заключается в попытках искать большие / меньшие значения. Если бы он дал 0, то, очевидно, он был бы идентифицирован как равный. Однако это вычисляет различия, подобные 4.2e-20. Я не могу использовать эти значения.

Christoph 22.04.2018 00:03
6.12323e-17 - это 0,0000000000000000612323. Единственный способ, которым это может вызвать проблему, - это прямое сравнение чисел с плавающей запятой, чего не следует делать в первую очередь. Вместо этого всегда используйте допуски.
BessieTheCookie 22.04.2018 00:05

Причина, по которой я решил их использовать, заключается в том, что размер моего изображения изменяется в зависимости от диапазона значений x и y. Таким образом, если все точки будут с разницей 0,5 или 200 разницей, они обе получат соответствующий размер изображения.

Christoph 22.04.2018 00:08

Возможный дубликат Почему числа с плавающей запятой неточны?

Max Vollmer 22.04.2018 00:56

Я голосую за то, чтобы закрыть этот вопрос как не по теме, потому что спрашивающий не понимает, как работают числа с плавающей запятой.

duffymo 22.04.2018 11:14
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
7
72
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы всегда работает с допусками при использовании чисел с плавающей запятой.

Вместо if (someDouble == 0.0) вы делаете if (fabs(someDouble) < EPSILON).

Вместо if (someDouble == someOtherDouble) вы делаете if (fabs(someDouble-someOtherDouble) < EPSILON).

EPSILON должен быть достаточно маленьким для хорошей точности и достаточно большим, чтобы учесть неточность с плавающей запятой, например constexpr const double EPSILON = 0.0001;.

См .: Почему числа с плавающей запятой неточны?

Другие вопросы по теме