Так вот, на мой взгляд, и происходит:
В обоих примерах PI - это определение, вероятно, определенное так:
#define 3.14 //and some more digits
В C ++ число, подобное этому,обрабатывается как double.
После предварительной обработки это выражение:
PI / 2.0f
будет обрабатываться как prvalue двойного типа.Это означает, что в этой строке скрыта еще одна операция:
float theta = PI / 2.f;
, которая является двойным преобразованием с плавающей точкой, что в данном случае определенно теряет некоторую точность.
В первом примере это также происходитздесь:
float p = (PI / 2.f) - theta;
но только после оценки всего выражения.Обратите внимание, что во время этой оценки (PI / 2.f)
будет по-прежнему удваиваться, но theta
будет преобразованным значением с плавающей запятой в двойную, что объясняет небольшую разницу в результате от 0,0.
В последнем примере вы сначала(PI / 2.f)
float p = PI / 2.f;
конвертировать *1023* в число с плавающей запятой, чтобы вычесть из него следующую строку с типом float theta
.Что должно привести к 0.0, который, вероятно, компилятор все равно оптимизирован).