对于计算机图形学的家庭作业,我们必须编写一个函数,它确定点 p
是否位于边 p1
到 p2 的左侧
。现在我和我的搭档有这个函数的两个不同版本,尽管计算的是相同的东西,但它们会产生不同的结果。
片段 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
。
是否存在一些干扰计算的编译器优化?
最佳答案
复制粘贴错误:
float edgeX = p2.x - p1.x;
float edgeY = p2.y - p1.x;
(p1.x)?
关于c++ - 应该相同的 C++ 片段之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40705976/