Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么System.Math和例如MathNet.Numerics基于double?_C#_Math_Double_Decimal - Fatal编程技术网

C# 为什么System.Math和例如MathNet.Numerics基于double?

C# 为什么System.Math和例如MathNet.Numerics基于double?,c#,math,double,decimal,C#,Math,Double,Decimal,中的所有方法都将double作为参数并返回参数。这些常数也是double类型。我退房了,那里似乎也是这样 为什么会这样?特别是常数。decimal不应该更精确吗?在进行计算时,这不是很有用吗?这是一个典型的速度与精度的权衡 但是,请记住,例如,对于PI,您需要的最多数字是41 pi的最大位数 你永远需要的是41。到 计算物体的周长 误差小于 质子的直径,需要41 pi†的位数。看起来很安全 得出41位数就足够了的结论 任意圆的pi精度 你可能会遇到的测量问题 遭遇因此,在过去的一年中 在计算机中

中的所有方法都将
double
作为参数并返回参数。这些常数也是
double
类型。我退房了,那里似乎也是这样


为什么会这样?特别是常数。
decimal
不应该更精确吗?在进行计算时,这不是很有用吗?

这是一个典型的速度与精度的权衡

但是,请记住,例如,对于PI,您需要的最多数字是41

pi的最大位数 你永远需要的是41。到 计算物体的周长 误差小于 质子的直径,需要41 pi†的位数。看起来很安全 得出41位数就足够了的结论 任意圆的pi精度 你可能会遇到的测量问题 遭遇因此,在过去的一年中 在计算机中计算的pi的万亿位数 2002年,第41位以外的所有数字 没有实用价值

此外,decimal和double的内部存储结构略有不同。小数被设计用来存储以10为基数的数据,其中双精度(和浮点数)用来保存二进制数据。在二进制计算机上(就像现有的每台计算机一样),当存储其范围内的任何数字时,double将具有更少的浪费位

还应考虑:

System.Double 8 bytes Approximately ±5.0e-324 to ±1.7e308 with 15 or 16 significant figures System.Decimal 12 bytes Approximately ±1.0e-28 to ±7.9e28 with 28 or 29 significant figures 系统。将大约±5.0e-324到±1.7e308的8个字节加倍,带有15或16个有效数字 系统十进制12字节,约为±1.0e-28至±7.9e28,具有28或29个有效数字
正如您所见,十进制的范围较小,但精度较高。

十进制更精确,但范围较小。物理和数学计算通常使用Double,但金融和货币计算则使用Decimal

有关详细信息,请参阅msdn上的以下文章

双重的

十进制

如果我冒险猜测,我会说这些函数利用了低级数学功能(可能在C中),在内部不使用小数,因此返回小数无论如何都需要从double转换为decimal。此外,十进制值类型的目的是确保准确性;如果没有无限精度(例如无理数),这些函数不会也不可能返回100%准确的结果。

否,-小数不比双精度或任何类型的小数更“准确”。“精确性”的概念(当谈到计算机中的数字表示时)是错误的。任何类型都绝对100%精确地表示某些数字。无符号字节在表示0到255之间的整数时是100%精确的。但它们对分数、负数或超出范围的整数都不好

小数100%精确地表示一组特定的基数10值。双精度(因为它们使用二进制IEEE指数表示法存储其值)精确地表示一组二进制数字。 一般来说,两者都不比另一种更准确,它们只是为了不同的目的

更详细地说,因为我对一些读者似乎不够清楚

如果你把每一个可以表示为十进制的数字都标在一行数字上,在每一对相邻的数字之间,有一个额外的无穷多个可以表示为十进制的实数。对于可以表示为双精度的数字,可以做出完全相同的陈述。如果数字行上的每一个小数点都用蓝色标记,每一个双精度点都用红色标记(整数除外),那么两种颜色中标记相同值的位置将非常少。 一般来说,对于99.99999%的分数(请不要挑剔我的百分比),蓝色的分数集(小数)与红色的分数集(双数)完全不同

这是因为根据我们对蓝色集合的定义,它是以10为基数的尾数/指数表示,而双精度是以2为基数的尾数/指数表示。以2为基数的尾数和指数表示的任何值,
(1.00110101001 x 2^(-111010011001)
表示取尾数值(
1.00110101001
)并将其乘以指数幂的2(当指数为负时,等于除以指数绝对值幂的2)这意味着,如果指数为负(或尾数的任何部分为分数二进制),则数字不能表示为十进制尾数和指数,反之亦然


对于任何随机落在实数行上的任意实数,它要么接近一个蓝色的小数,要么接近一个红色的双精度。

如果你需要精确的东西,十进制、浮点或双精度都不够好。此外,十进制非常昂贵,而且过度使用,这正成为一个常见的笑话e

如果你在分数中工作并且需要最终精度,请使用分数。这是同样的老规则,只在必要时转换一次。你的舍入规则也会因应用程序、域等而异,但你可以找到一两个合适的例子。但是,如果你想要分数和最终精度,答案是不要使用任何东西但是分数可能也会考虑到任意精度的特征。

一般来说,CLR的实际问题是,实现一个以泛型方式处理数字的库非常奇怪和简单,这主要是由于糟糕的原始设计和该平台最流行的编译器的缺陷。这与Java的失败几乎相同

事实证明,double是覆盖大多数领域的最佳折衷方案,它运行良好,尽管事实上MS JIT仍然无法利用CPU技术