Я написал себе крошечную функцию, которая преобразует угол в радианы:
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. Неточность приводит к поломке всего моего графического движка, поэтому я хотел бы найти способ избавиться от него. этого.
Я очень сомневаюсь, что несоответствие между 6e-17 и 0 могло «испортить [ваш] графический движок»
Проблема заключается в попытках искать большие / меньшие значения. Если бы он дал 0, то, очевидно, он был бы идентифицирован как равный. Однако это вычисляет различия, подобные 4.2e-20. Я не могу использовать эти значения.
6.12323e-17 - это 0,0000000000000000612323. Единственный способ, которым это может вызвать проблему, - это прямое сравнение чисел с плавающей запятой, чего не следует делать в первую очередь. Вместо этого всегда используйте допуски.
Причина, по которой я решил их использовать, заключается в том, что размер моего изображения изменяется в зависимости от диапазона значений x и y. Таким образом, если все точки будут с разницей 0,5 или 200 разницей, они обе получат соответствующий размер изображения.
Возможный дубликат Почему числа с плавающей запятой неточны?
Я голосую за то, чтобы закрыть этот вопрос как не по теме, потому что спрашивающий не понимает, как работают числа с плавающей запятой.





Вы всегда работает с допусками при использовании чисел с плавающей запятой.
Вместо if (someDouble == 0.0) вы делаете if (fabs(someDouble) < EPSILON).
Вместо if (someDouble == someOtherDouble) вы делаете if (fabs(someDouble-someOtherDouble) < EPSILON).
EPSILON должен быть достаточно маленьким для хорошей точности и достаточно большим, чтобы учесть неточность с плавающей запятой, например constexpr const double EPSILON = 0.0001;.
Считайте
6.12323e-17равным 0. Вы имеете дело сdouble.