【问题标题】:Can C# store more precise data than doubles?C# 可以存储比双精度数据更精确的数据吗?
【发布时间】:2011-07-25 07:03:21
【问题描述】:

double 在 C# 中的精度不足以满足我的需求。我正在编写一个分形程序,放大几次后,我的精度不够了。

我有一种数据类型可以保存比双精度更精确的浮点信息(即更多小数位)吗?

【问题讨论】:

  • 如果要显示分形,应该可以无限缩放。您可能想要搜索根据缩放级别返回值的算法。

标签: c# types double precision


【解决方案1】:

是的,decimal 就是为此而设计的。

但是,请注意十进制类型的范围小于双精度。也就是说 double 可以保持更大的值,但这样做是通过失去精度来实现的。或者,如 MSDN 所述:

decimal 关键字表示 128 位 数据类型。与浮点数相比 类型,十进制类型具有更大的 精度和更小的范围,其中 使其适用于金融和 货币计算。近似值 小数的范围和精度 类型如下表所示。

decimaldouble 之间的主要区别在于decimal is fixed-point and double is floating point。这意味着十进制存储一个精确的值,而double 表示一个由分数表示的值,并且不太精确。 decimal 是 128 位,因此需要双倍空间来存储。 decimal 的计算速度也较慢(测量!)。

如果您需要更大的精度,则可以从 .NET 4 使用BigInteger。(您需要自己处理小数点)。在这里您应该知道,BigInteger 是不可变的,因此对其进行的任何算术运算都会创建一个新实例 - 如果数字很大,这可能会影响性能。

我建议您仔细研究您需要精确到什么程度。也许您的算法可以使用标准化值,可以更小?如果性能是一个问题,内置浮点类型之一可能会更快。

【讨论】:

  • Integer、double、float、decimal 也是不可变的,并且算术运算会创建新的实例......所以这是一条红鲱鱼。 Decimal 和 BigInteger 很慢,因为它们不仅仅是简单的硬件原语。
  • 好吧,这并不完全是一个红鲱鱼,因为与其他固定大小的数字类型相比,它们可以任意增长,但如果是这种情况,则该值不适合其他类型无论如何。
  • Decimal 是浮点类型,尽管它的动态范围小于float。我觉得设计很奇怪,因为该类型需要 16 个字节,而具有 68 位整数部分和 60 位小数的类型几乎可以完成 Decimal 更有效地完成的所有工作。高端的范围和低端的精度都没有那么多,但能够保证加法和减法要么以完美的精度执行,要么完全失败——double 不提供保证。
【解决方案2】:

.NET Framework 4 引入了 System.Numerics.BigInteger 结构,它可以保存具有任意大精度的数字。

【讨论】:

  • 但请注意,对 BigInteger 进行算术运算可能会很慢。
【解决方案3】:

如果您需要比Decimal 更高的精度,请查看BigInteger (.NET 4)。

【讨论】:

  • BigInteger(如int)只能存储整数。
  • 是的,但是修改分形算法以使用整数或将 BigInteger 伪造为定点小数通常很容易。
猜你喜欢
  • 1970-01-01
  • 2010-09-14
  • 2015-06-05
  • 1970-01-01
  • 2017-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多