我正在使用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;
答案 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