数字类型中的 C# 跟踪精度和累积舍入误差

C# tracking precision and accumulated rounding error in number types

提问人:user802599 提问时间:1/25/2018 更新时间:1/25/2018 访问量:182

问:

我正在编写一些代码来做一些数学运算(用于研究项目),我不确定我需要什么级别的精度,或者舍入误差会在我的结果中引入多少差异。

例如,我想做的一件事是通过将所有三角形的面积相加来计算 3D 模型零件的表面面积。 在具有几百个三角形的简单模型上,这可能工作正常,但在具有数万个三角形的更复杂模型上,这可能会开始引入大量舍入误差,这些误差可能会累积。

谁能为我推荐一种策略来克服舍入误差,或者只是一种跟踪舍入误差大小的方法。例如,我是否可以使用机器 epsilon 值并计算出在计算的每个阶段可能引入的误差量,并保留可能的累积误差的运行总数?

我想使用不同的类型测试一些代码。我知道浮点数会给我 7 位数字、双 15-16 位数字和十进制 28-29 位数字。 有没有办法编写一次我的方法并推断类型,而不是为每个数字类型编写一个版本?

C# 浮动精度 epsilon

评论

0赞 Koby Duck 1/25/2018
decimal对于大量几何图形来说太慢了。用于提高性能和更高的舍入误差容错。double

答:

0赞 Jonathan Wood 1/25/2018 #1

如果我理解正确,您可以使用泛型。

public T Calculate<T>(T input) where T : struct
{
    // Perform calculations here
}

或者您可以使用重载。

public float Calculate(float input)
{
    // Perform calculations here
}

public double Calculate(double input)
{
    // Perform calculations here
}

public decimal Calculate(decimal input)
{
    // Perform calculations here
}

根据提供的详细信息,我无法判断哪个会起作用。