-1

我正在使用 SDL 编码线框渲染。
我需要对双数进行一些运算,但我做的最后一个总和给出了非常奇怪的数字。

代码片段是:

double screenCoordinate[2] = {0, 0};

// now map [-1,1] into the screen coordinates (0,width) and (0,height)
// where (0,0) is the top-left corner of the screen
screenCoordinate[0] = (vertexViewSpace(0) * (640.0/2.0));
screenCoordinate[0] += (640.0/2.0);
screenCoordinate[1] = (-vertexViewSpace(1) * (480.0/2.0));
screenCoordinate[1] += (480.0/2.0);

我将每个操作分为两部分,以便更轻松地调试它。

的第一个值是什么并不重要screenCoordinate[0],因为从第二个总和screenCoordinate[0]将等于 的一半640.0

相同screenCoordinate[1],第一个乘法值无关紧要,总和的最后一行screenCoordinate[1]等于 的一半480.0

我真的不知道为什么会这样。谁能帮我?

PS我已经完成了你建议的所有调试。我会给她举一个我在调试期间读过的例子:

screenCoordinate[0] = 1.9477670227253643e-017 * 320.0;
screenCoordinate[0] = 6.2328544727211657e-015 + 320.0;
screenCoordinate[1] = -1.2985113484835763e-017 * 240;
screenCoordinate[1] = -3.1164272363605833e-015 + 240.0;

所以使用计算器的结果应该是:

screenCoordinate[0] = 382,328544727211657;
screenCoordinate[1] = 208,835727636394167;

但我明白了

screenCoordinate[0] = 320.00000000000000;
screenCoordinate[0] = 240.00000000000000;
4

2 回答 2

1

您不能使用双精度数将小数精确地添加到大数中。将 1.0e-15 添加到 320.0 将得到 320.0,因为您只有有限的精度。尝试重新安排你的计算,这样你就不会添加小数和大数。

于 2013-10-17T15:58:27.407 回答
0

你有这些计算:

screenCoordinate[0] = 6.2328544727211657e-015 + 320.0;
screenCoordinate[1] = -3.1164272363605833e-015 + 240.0;

你说你应该得到这个结果:

screenCoordinate[0]: 382,328544727211657
screenCoordinate[1]: 208,835727636394167

然而这是不正确的,你应该得到这个结果:

screenCoordinate[0]: 320,00000000000000623285447272117
screenCoordinate[1]: 239,99999999999999688357276363942

双精度通常在内部由 8 个字节表示。只有 8 个字节,你不能代表无限的数字集。您只能表示 2^32 个数字。这会导致您的结果四舍五入到您实际上可以用双精度表示的最接近的数字,即:

screenCoordinate[0]: 320
screenCoordinate[1]: 240
于 2013-10-17T16:17:49.900 回答