提问人:user802599 提问时间:1/25/2018 更新时间:1/25/2018 访问量:182
数字类型中的 C# 跟踪精度和累积舍入误差
C# tracking precision and accumulated rounding error in number types
问:
我正在编写一些代码来做一些数学运算(用于研究项目),我不确定我需要什么级别的精度,或者舍入误差会在我的结果中引入多少差异。
例如,我想做的一件事是通过将所有三角形的面积相加来计算 3D 模型零件的表面面积。 在具有几百个三角形的简单模型上,这可能工作正常,但在具有数万个三角形的更复杂模型上,这可能会开始引入大量舍入误差,这些误差可能会累积。
谁能为我推荐一种策略来克服舍入误差,或者只是一种跟踪舍入误差大小的方法。例如,我是否可以使用机器 epsilon 值并计算出在计算的每个阶段可能引入的误差量,并保留可能的累积误差的运行总数?
我想使用不同的类型测试一些代码。我知道浮点数会给我 7 位数字、双 15-16 位数字和十进制 28-29 位数字。 有没有办法编写一次我的方法并推断类型,而不是为每个数字类型编写一个版本?
答:
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
}
根据提供的详细信息,我无法判断哪个会起作用。
评论
decimal
对于大量几何图形来说太慢了。用于提高性能和更高的舍入误差容错。double