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

本文关键字:结果 代码 返回 | 更新日期: 2023-09-27 18:01:48

给定以下算法:

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值在运行之间有一点偏差(差异非常小,但对我的使用至关重要)。

此算法用于多人游戏(使用Unity3D),两端以完全相同的四个点运行此算法。

Vector的每个值都是float,语言是C#,两端运行在同一台PC上(一个客户端使用Unity编辑器运行,另一个是由Unity构建的可执行文件),操作系统在Windows

Lerp功能-http://docs.unity3d.com/ScriptReference/Vector3.Lerp.html

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

如果0.1的精度对你的眼睛来说很重要,那么使用双精度浮点数可能是一个更好的主意,因为每次使用浮点数进行计算都会增加一些不精度。在你的例子中,你是在一个for循环中使用浮点数,所以一些不精确的地方会导致很大的差异。

关于这个问题,stackOverflow有一个很好的答案:浮点误差示例

建议将这些vector3包装成一个双版本的vector3。至于exe和编辑器之间的差异,可能是因为exe和编辑器不是为相同的目标构建的。而且这两种方法的可用资源并不完全相同。现在,如果在同一台PC上,您设法找到差异,您可能无法从不同架构的多台PC上获得干净的结果。