2016-11-20 3 views
0

Для домашней работы для компьютерной графики мы должны написать функцию, которая определяет, находится ли точка p с левой стороны от края p1 до p2. Теперь у моего партнера и у меня есть две разные версии этой функции, которые дают разные результаты, несмотря на то, что они вычисляют то же самое.Разница между фрагментами C++, которые должны быть идентичными

Отрывок 1:

// The direction of the line from p1 to p: 
float lineX = p.x - p1.x; 
float lineY = p.y - p1.y; 
// The direction of the triangle's edge from p1 to p2: 
float edgeX = p2.x - p1.x; 
float edgeY = p2.y - p1.x; 

// The z component of the cross product (line x edge): 
float F = lineX * edgeY - lineY * edgeX; 

Отрывок 2:

float x = p.x; 
float y = p.y; 
float X = p1.x; 
float Y = p1.y; 
float dX = p2.x - p1.x; 
float dY = p2.y - p1.y; 

float F = ((x-X) * dY - (y-Y) * dX); 

Я знаю, что операции с плавающей точкой не является коммутативной ни ассоциативной. Однако, по моему мнению, порядок расчетов должен быть точно таким же, начиная с lineX = x-X и edgeX = dX.
Есть ли какая-то оптимизация компилятора, которая мешает вычислениям?

ответ

4

Копирование и вставка ошибок:

float edgeX = p2.x - p1.x; 
float edgeY = p2.y - p1.x; 

(p1.x)?

+1

Да. Я тупой. : D Спасибо! :) – J0hj0h

Смежные вопросы