双数字的总和给出了一个奇怪的数字

时间:2013-10-17 14:34:32

标签: c++ double

我正在使用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的一半。

我真的不知道为什么会这样。任何人都可以帮助我吗?

P.S。 我已经完成了你所建议的所有调试。 我会给她一个我在调试过程中读过的例子:

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;

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分: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

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

screenCoordinate[0]: 320
screenCoordinate[1]: 240