Точность и округление с помощью тригонометрических вычислений в C++

Чтобы вычислить верхний левый угол ограничивающей рамки повернутого прямоугольника (например, Рассчитать координаты ограничивающей рамки из повернутого прямоугольника) Я пытаюсь действовать по-разному в зависимости от угла поворота (для определения квадрантов 0..90°..180°..270°..360° ), указанный в градусах. Угол конвертируется в радианы для сравнения с PI:

// http://codepad.org/zCxKJy30

#include <iostream>
#include "math.h"

using namespace std;

int main()
{
    float deg = 90.0;
    float rad = deg / 360.0 * 2.0 * M_PI;

    if( rad <= M_PI/2.0)
    {
        cout << "less or equal";
    }
    else
    {
        cout << "larger";
    }
    return 0;
}

Я ожидал, что условие будет истинным, но это не так.

Мне было интересно, есть ли простое решение, в отличие от правильно округленные тригонометрические функции в градусах? и Как я могу учесть ошибки округления в арифметике с плавающей запятой для обратных триггерных (и sqrt) функций (в C)? предложите.

Я только что попробовал использовать тип double, и тогда сравнение работает, как и ожидалось: http://codepad.org/UHcee1RE

Почему повышение точности приводит к «правильной» оценке?


person handle    schedule 18.09.2014    source источник
comment
Возможно, дубликат Почему числа с плавающей запятой неточны? (Я не буду касаться математики десятифутовым шестом, но я сильно подозреваю, что вы не знаете, насколько ограничен тип float на самом деле...)   -  person DevSolar    schedule 18.09.2014
comment
Вы используете константы двойной точности и арифметику, но округляете до одинарной точности. Использование двойной точности во всем, кажется, дает правильный результат:   -  person Paul R    schedule 18.09.2014
comment
Учтите, что ни "math.h", ни M_PI не являются стандартными C++.   -  person Fytch    schedule 18.09.2014
comment
Если ваше значение в градусах, почему вы не можете сравнить его с 90 градусами? И да, как было сказано ранее, в настоящее время крайне не рекомендуется использовать числа с плавающей запятой из-за округления при вычислениях. Вместо этого используйте double или вычисления с фиксированной точкой. И да, имейте в виду, что любые значения с плавающей запятой нельзя строго сравнивать, любое конкретное значение с плавающей запятой на самом деле означает, что оно попадает в некоторый интервал, но не равно значению.   -  person NBR    schedule 18.09.2014