XNA 上的浮点精度

Float precision on XNA

提问人:s0ubap 提问时间:1/11/2013 最后编辑:Soner Gönüls0ubap 更新时间:1/11/2013 访问量:795

问:

我正在使用 Visual Studio 2010 Ultimate,在 .Net framework 4 上工作。

Precision issue

和的类型是 ,来自 XNA 框架。groundControlPointworldPositionVector2

我知道每个调试器都使用自己的精度管理,但这个问题使我的代码无法正常工作。 我想将我的加法与给定的浮点值进行比较(在我的情况下是 5166.28003..),但由于我的加法结果是,它总是错误的......5166.28027

关于如何理解这一点的任何提示?

C# 可视化工作室 2010 xna 浮点精度

评论

0赞 s0ubap 1/11/2013
好吧,我在这里真的不需要非常高的精度......这是一个标准的浮点数加法,两个结果之间的差异很大,不是吗?
0赞 Richard Ev 1/11/2013
@s0ubap - 您看到的差异是预期的,在使用时,请参阅我的答案。float
0赞 Ani 1/11/2013
你能发布你在这个浮点数上执行的计算吗?您可能有一些方法可以重新排列计算以保持精度和/或将测试移动到其他位置。提高精度仍然是最后的手段。哦,@Dimitri是对的——你应该回去接受你之前问题的一些答案。
0赞 s0ubap 1/11/2013
好的,我通过制作一个 AlmostEquals 函数来解决我的问题,根据 float 的 7 位精度使用正确的 epsilon。似乎工作得很好。如果需要,我会将浮点数更改为双倍,但这需要很多工作,所以我宁愿不:)谢谢大家!

答:

1赞 Richard Ev 1/11/2013 #1

MSDN 中所述,精度仅为 7 位......float

该类型可以表示从大约 1.5 × 10E−45 到 3.4 × 10E38 的值,精度为 7 位。float

在您的例子中,您正在处理的值是 ,因此它只能精确到小数点后第 3 位。5166.28003

如果需要更高的精度,请考虑使用(精度为 15-16 位)或十进制(通常用于财务和货币计算)。double

1赞 Soner Gönül 1/11/2013 #2

float仅精确到 7 位。从MSDN看。

float 类型可以表示大约 1.5 × 之间的值 10−45 到 3.4 × 1038,精度为 7 位。

十进制类型看起来更适合您的情况。

decimal 类型是一种 128 位数据类型,适用于金融和 货币计算。decimal 类型可以表示范围的值 从 1.0 × 10−28 到大约 7.9 × 1028,其中 28-29 显著 数字。

评论

0赞 Sayse 1/11/2013
我认为他在 XNA 中使用了定义为浮点数的变量,因此他无法控制要使用的变量,编辑:除了在添加之前进行转换Vector2X
0赞 s0ubap 1/11/2013
@Sayse 你说得对,我没有任何控制权......我看到的唯一好的解决方案是创建我自己的 Vector2 类,使用 double...但我想,接下来我就得处理表演了