C#能否存储比双精度浮点数更精确的数据?

14

C#中的double类型对于我的需求来说不够精确。我正在编写一个分形程序,当我缩放几次后,就会失去精度。

是否有一种数据类型可以保存比double更多精确的浮点信息(即更多的小数位数)?


10
如果您想展示分形图像,缩放应该可以无限进行。您可能需要查找一种算法,根据缩放级别返回相应的数值。 - Martin Hennings
3个回答

22

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

然而,请注意,decimal类型的范围比double小。double可以容纳更大的值,但会失去精度。或者,如MSDN所述:

decimal关键字表示一个128位数据类型。 与浮点类型相比,decimal类型具有更高的精度和更小的范围, 这使其适用于金融和货币计算。下表显示了decimal类型的近似范围和精度。

decimaldouble之间的主要区别在于decimal是定点数,而double是浮点数。这意味着decimal存储精确值,而double表示由分数表示的值,并且不太精确。decimal是128位的,因此需要双倍的空间来存储。在decimal上的计算也较慢(请注意!)。

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

我建议您确切地了解需要多么精确。也许您的算法可以使用规范化值,这些值可以更小?如果性能是一个问题,内置的浮点类型中的一种可能会更快。


1
整数、双精度、浮点和十进制都是不可变的,算术运算会创建新实例...所以这是一个误导。十进制和BigInteger之所以慢,是因为它们不仅仅是简单的硬件原语。 - Mark Sowul
1
好的,没错,这不完全是个转移注意点,因为与其他固定大小的数字类型相比,它们可以任意增长,但如果那样的话,该值也无法适应其他类型。 - Mark Sowul
Decimal是一种浮点类型,尽管其动态范围小于float。我觉得这个设计很奇怪,因为该类型占用16个字节,而一个带有68位整数部分和60位小数部分的类型几乎可以更高效地完成Decimal所做的一切。在高端没有那么多范围,在低端没有那么精确,但能够保证加法和减法要么完全精确执行,要么完全失败--这是double无法提供的保证。 - supercat

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

1
但请注意,在BigInteger上执行算术运算可能会很慢。 - driis

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

4
BigInteger(类似于 int)只能存储整数。 - Adam Robinson
是的,但通常很容易修改分形算法以使用整数或模拟大整数作为定点小数。 - Jonas Elfström

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接