【发布时间】:2011-07-25 07:03:21
【问题描述】:
double 在 C# 中的精度不足以满足我的需求。我正在编写一个分形程序,放大几次后,我的精度不够了。
我有一种数据类型可以保存比双精度更精确的浮点信息(即更多小数位)吗?
【问题讨论】:
-
如果要显示分形,应该可以无限缩放。您可能想要搜索根据缩放级别返回值的算法。
double 在 C# 中的精度不足以满足我的需求。我正在编写一个分形程序,放大几次后,我的精度不够了。
我有一种数据类型可以保存比双精度更精确的浮点信息(即更多小数位)吗?
【问题讨论】:
是的,decimal 就是为此而设计的。
但是,请注意十进制类型的范围小于双精度。也就是说 double 可以保持更大的值,但这样做是通过失去精度来实现的。或者,如 MSDN 所述:
decimal 关键字表示 128 位 数据类型。与浮点数相比 类型,十进制类型具有更大的 精度和更小的范围,其中 使其适用于金融和 货币计算。近似值 小数的范围和精度 类型如下表所示。
decimal 和double 之间的主要区别在于decimal is fixed-point and double is floating point。这意味着十进制存储一个精确的值,而double 表示一个由分数表示的值,并且不太精确。 decimal 是 128 位,因此需要双倍空间来存储。 decimal 的计算速度也较慢(测量!)。
如果您需要更大的精度,则可以从 .NET 4 使用BigInteger。(您需要自己处理小数点)。在这里您应该知道,BigInteger 是不可变的,因此对其进行的任何算术运算都会创建一个新实例 - 如果数字很大,这可能会影响性能。
我建议您仔细研究您需要精确到什么程度。也许您的算法可以使用标准化值,可以更小?如果性能是一个问题,内置浮点类型之一可能会更快。
【讨论】:
Decimal 是浮点类型,尽管它的动态范围小于float。我觉得设计很奇怪,因为该类型需要 16 个字节,而具有 68 位整数部分和 60 位小数的类型几乎可以完成 Decimal 更有效地完成的所有工作。高端的范围和低端的精度都没有那么多,但能够保证加法和减法要么以完美的精度执行,要么完全失败——double 不提供保证。
.NET Framework 4 引入了 System.Numerics.BigInteger 结构,它可以保存具有任意大精度的数字。
【讨论】:
如果您需要比Decimal 更高的精度,请查看BigInteger (.NET 4)。
【讨论】:
BigInteger(如int)只能存储整数。