C# 4.0 为什么System.Numerics.Complex使用双精度而不是小数?

C# 4.0 为什么System.Numerics.Complex使用双精度而不是小数?,c#-4.0,floating-point,C# 4.0,Floating Point,我最近一直在使用System.Numerics.Complex,我开始注意到典型的浮点“漂移”,其中存储的值被计算出百万分之一或类似的值,这是众所周知的,常见于float类型,甚至double类型。我查看了这个复杂的结构,果然,它使用了double变量。为什么它使用double值来存储数据,而不是decimal值,这是为了防止这种情况发生?如何解决这个问题?回答您的问题: doubles速度快几个数量级,因为操作是在硬件级别完成的 对于大型计算,base-2浮点实际上更精确,因为上下移动指数时“

我最近一直在使用
System.Numerics.Complex
,我开始注意到典型的浮点“漂移”,其中存储的值被计算出百万分之一或类似的值,这是众所周知的,常见于
float
类型,甚至
double
类型。我查看了这个复杂的结构,果然,它使用了
double
变量。为什么它使用
double
值来存储数据,而不是
decimal
值,这是为了防止这种情况发生?如何解决这个问题?

回答您的问题:

  • double
    s速度快几个数量级,因为操作是在硬件级别完成的
  • 对于大型计算,base-2浮点实际上更精确,因为上下移动指数时“抖动”更少:1位精度小于1位十进制数字。此外,base-2可以使用隐式前导位,这意味着它们可以表示比其他基数更多的数字
  • 复数通常用于科学/工程应用,其中约10-16的较小相对误差被其他误差源(例如,由于测量或模型)所抵消
  • 另一方面,小数通常用于“记帐”类型的运算,其中舍入误差通常可以忽略不计(即小数字的加法、整数的乘法等)

  • decimal
    不是为防止漂移而设计的。它被设计成精确地表示十进制值。它使用128位这一事实可能会让你更容易接受漂移,但额外的精度是以性能为代价的,以至于设计师们认为基于
    double
    复杂的
    类型会更好地满足大多数人的需求。大自然不会用10个手指计算,只有人类有。NET的十进制也有一个相当小的指数范围(在十进制中,它被称为“刻度”),大约在10^28和10^28之间。双精度的范围要大得多。@HansPassant:自然也不会用两个手指计数。不过,电脑确实如此。当然,一只负重燕子的飞行速度只能用有限的以蟒蛇为基数的数字来精确表示。