C OpenGL程序中返回零的数学函数

C OpenGL程序中返回零的数学函数,c,opengl,C,Opengl,我已经知道你们中没有人能够复制这个bug,但我甚至不知道该尝试什么。代码如下: void Arrow2D(double x, double y, double x2, double y2, double width) { double deltaX = x2 - x; double deltaY = y2 - y; double angle = atan2(deltaY, deltaX) * 180 / 3.14; double heightArrow = sqr

我已经知道你们中没有人能够复制这个bug,但我甚至不知道该尝试什么。代码如下:

void Arrow2D(double x, double y, double x2, double y2, double width) {
    double deltaX = x2 - x;
    double deltaY = y2 - y;
    double angle = atan2(deltaY, deltaX) * 180 / 3.14;
    double heightArrow = sqrt(deltaX*deltaX + deltaY*deltaY);
    printf("height = sqrt(%f) = %f\n", deltaX*deltaX + deltaY*deltaY, heightArrow);
    /*glPushMatrix(GL_MODELVIEW);
    glRotatef(angle, 0.0, 0.0, 1.0);
    glColor3f(1.0, 1.0, 1.0);

    //glTranslatef(200, 200, 0);
    glBegin(GL_QUADS);
    glVertex2f(-width/2, 20);
    glVertex2f(-width/2, 0);
    glVertex2f(width/2, 0);
    glVertex2f(width/2, 20);
    glEnd();
    glBegin(GL_TRIANGLES);
    glVertex2f(-width/1.2, 20);
    glVertex2f(+width/1.2, 20);
    glVertex2f(0, 30);
    glEnd();

    glPopMatrix(GL_MODELVIEW);*/
}

现在,如果对第二部分进行了注释,则变量
heightArrow
的值将正确打印。如果我取消注释注释注释代码,我只会得到以下打印:

height = sqrt(5000.000000) = 0.000000

基本上,我总是得到0作为输出(这与我用来计算角度的atan2函数的行为相同)。在GLUT
display
方法中调用的可视化函数之一中调用了
Arrow2D
方法。

您使用的编译器版本和优化选项是什么?您能为这两种情况下的函数发布编译器的汇编输出吗?(
-S-masm=intel
选项用于GCC,
-FAsc
用于MSVC)。您的GL实现可能会弄乱FPU的舍入控制字之类的东西。即使不是,也不应该将双精度浮点变量传递给
glVertex2f(…)
,OpenGL有一组后缀为
d
的双精度函数。使用单精度或使用适当的GL API调用。一个好的编译器应该警告你这样做。你真的在这段代码中包含了吗?我猜不会,因为否则编译器会警告您glPush/PopMatrix不接受任何参数。既然您提供了参数,我猜这会破坏堆栈或registers@HughFisher:删除此选项实际上解决了问题,谢谢@HughFisher你能把这个作为答案吗?它看起来对未来的游客很有用。