相同的代码返回不同的结果

给定以下algorithm:

public static void Casteljau(Vector3 p1, Vector3 p2, Vector3 p3 , Vector3 p4, ArrayList L) { float stepping = (float)(0.02); for (float x = 0.0f; x <= 1.0f; x += stepping) { Vector3 ap1 = Vector3.Lerp(p1, p2, x); Vector3 ap2 = Vector3.Lerp(p2, p3, x); Vector3 ap3 = Vector3.Lerp(p3, p4, x); Vector3 bp1 = Vector3.Lerp(ap1, ap2, x); Vector3 bp2 = Vector3.Lerp(ap2, ap3, x); Vector3 p = Vector3.Lerp(bp1, bp2, x); L.Add(p); } } 

它得到四个点并返回代表它们之间的曲线的点列表,并且给予与该函数相同的四个点,在两个不同的端点\客户端中得到不同的结果。 其中一个计算得出的点之间的0.1f值有一点偏差(它的差别非常小,但是对我的使用非常重要)。

该algorithm用于多人游戏(使用Unity3D),两端运行该algorithm的四点完全相同。

Vector每个值都是float,语言是C# ,两端运行在同一台PC上(一个客户端使用Unity编辑器运行,另一个使用Unity创build的executabe),Windows中的Windows

Lerpfunction – http://docs.unity3d.com/ScriptReference/Vector3.Lerp.html

如果0.1的准确性对你的双眼来说很重要,那么双打可能是一个更好的主意,因为每一次用浮点数计算都会增加一些不精确性。 在你的情况下,你在一个for循环与浮动工作,所以一些imprecisions可以导致巨大的差异。

关于这个有一个很好的stackoverflow的答案: 浮点不准确的例子

一个建议是将这些vector3换成vector3的双重版本。 至于exe和编辑器之间的区别,它是可能的,因为Exe和编辑器不是为同一个目标而构建的。 而且他们两人的资源都不一样。 现在,如果在同一台PC上设法找到差异,您可能无法从不在同一架构上的多台PC获得清晰的结果。