gpt4 book ai didi

c# - 相同的代码返回不同的结果

转载 作者:可可西里 更新时间:2023-11-01 10:44:38 26 4
gpt4 key购买 nike

给定以下算法:

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 的精度对您的眼睛很重要,那么使用 double 可能是一个更好的主意,因为每个使用 float 进行的计算都会增加一些不精确性。在您的情况下,您处于一个使用 float 的 for 循环中,因此一些不精确可能会导致很大的不同。

stackOverflow 对此有一个很好的回答: Floating point inaccuracy examples

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

关于c# - 相同的代码返回不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31322787/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com