相同浮点计算的结果不同

时间:2012-12-12 20:00:26

标签: c++ graphics floating-point raytracing

在我正在进行的光线追踪任务中,我要计算摄像机射线的X偏移量;偏移计算就像这样

FovY作为输入;我记得在读取变量的那一刻将它转换为弧度。

OffsetX = tan (FovX / 2) * ((col - (width / 2)) / (width / 2))

FovX = tan(FovY / 2) * aspect = tan(FovY / 2) * (width / height)

代入原始等式并编写代码:

float OffsetX = tan(FovY / 2.0f) * (width / height) * ((col - (width / 2.0f)) / (width / 2.0f));

给了我一个不正确的拉伸图像,我花了好几个小时才把它弄好,这是在发现简化它之后同样的方程式有用之后。

最终重新排列的等式是:

float OffsetX = tan(FovY / 2.0f) * (2.0f / height) * (col - (width / 2.0f));

我尝试过调试,两个方程的结果确实不同。

是否会出现某种轮回错误?有人可以向我解释这个怪癖吗?

#include <cmath>
#include <iostream>
#include <cstdint>

using namespace std;

int main()
{
    const float PI = 3.1415f;
    const uint32_t width = 160, height = 120;
    const auto fovy = (30.0f * (PI / 180.0f));
    size_t j = 0;
    auto alpha = (tan(fovy / 2.0f) * (width / height)) * (((j + 0.5f) - (width / 2.0f)) / (width / 2.0f));
    cout << alpha << endl;
    alpha = tan(fovy / 2.0f) * (2.0f / height) * ((j + 0.5f) - (width / 2.0f));
    cout << alpha << endl;
}

1 个答案:

答案 0 :(得分:6)

我猜:宽度和高度是整数。

当你这样做时:

(width / height)

你得到整数除法,它会丢弃结果的小数部分。如果您改为:

((double)width / height)
然后两个结果几乎相同。


另外,您可以进一步简化表达式:

tan(FovY / 2.0f) * (2.0f*col - width) / height