【问题标题】:Different results for the same float calculations相同浮点计算的不同结果
【发布时间】:2016-06-08 11:59:12
【问题描述】:

在我正在做的光线追踪任务中,我必须计算从相机拍摄的光线的 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;
}

【问题讨论】:

  • 您能否提供一个完整的可运行示例,显示计算结果的两种方式,并显示两种方法不同的一些输入。它会从你的问题中消除很多歧义。
  • 除非你可以展示两段不同的代码来重现与你有关的任何行为,否则很难提供帮助
  • 当我发现需要它时,我花了几分钟用代码更新它;其中有人对这个问题投了反对票:(

标签: c++ graphics floating-point raytracing


【解决方案1】:

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

当你这样做时:

(width / height)

你得到的是整数除法,它会丢弃结果的小数部分。如果你这样做:

((double)width / height)

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


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

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

【讨论】:

  • 这是一个常见的错误,通灵调试是我的专长。 =)
  • @StephenCanon:嗯,这让我更容易为你提交错误报告。
  • 需要多少苹果工程师才能完成这样的任务? ;)
猜你喜欢
  • 2013-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-20
  • 1970-01-01
  • 1970-01-01
  • 2014-07-20
相关资源
最近更新 更多