gpt4 book ai didi

c++ - 同一个浮点计算的不同结果

转载 作者:行者123 更新时间:2023-11-30 00:54:38 29 4
gpt4 key购买 nike

在我正在进行的光线追踪任务中,我必须计算从相机射出的光线的 X 偏移量;偏移计算是这样的

FovY 作为输入给出;我记得在读取变量时将其转换为弧度。

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

FovX = tan(FovY/2) * aspect = tan(FovY/2) * (宽度/高度)

代入原方程并编写代码:

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

给了我一个不正确的拉伸(stretch)图像,我花了几个小时才把它弄对,这是在发现相同的方程式在简化后仍然有效之后。

最终重新排列的等式是:

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;
}

最佳答案

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

当你这样做时:

(width / height)

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

((double)width / height)

那么这两个结果将几乎相同。


顺便说一句,您可以进一步简化表达式:

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

关于c++ - 同一个浮点计算的不同结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13847618/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com