Svi*_*ish 7 c# math double decimal
System.Math中的所有方法都double作为参数并返回参数.常量也是类型double.我检查了MathNet.Numerics,在那里似乎也是如此.
为什么是这样?特别是对于常数.不decimal应该更准确吗?在进行计算时,这通常不会有用吗?
Joh*_*zen 16
这是一种经典的速度与准确性权衡.
但是,请记住,对于PI,例如,您需要的最多数字是41.
你需要的pi的最大位数是41.要计算宇宙的周长,误差小于质子的直径,你需要41位数的pi†.对于您可能遇到的任何圆测量问题,41个数字在pi中的准确度是足够的,这似乎是安全的.因此,在2002年计算的超过一万亿个数字的pi中,超过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
如您所见,decimal的范围较小,但精度较高.
不, - 小数并不比双打更“精确”,或者就此而言,任何类型。“精确性”的概念(当谈到计算机中的数字表示时)是错误的。任何类型在表示某些数字时绝对 100% 准确。无符号字节在表示从 0 到 255 的整数时 100% 准确。但它们不适用于分数或范围外的负数或整数。
小数在表示一组特定的以10为底的值时100% 准确。doubles(因为它们使用二进制IEEE 指数表示存储它们的值)精确地表示一组二进制数。一般来说,两者都不比另一个更精确,它们只是用于不同的目的。
进一步详细说明,因为我对某些读者来说似乎不够清楚......
如果你取每一个可表示为小数的数,并将它们中的每一个都标记在数轴上,那么在它们的每对相邻对之间都有一个额外的无穷大实数,它们不能表示为小数。对于可以表示为双精度数的数字,可以做出完全相同的声明。如果您将数轴上的每个小数标记为蓝色,将每个双精度数标记为红色,除了整数,将很少有地方用两种颜色标记相同的值。一般来说,对于 99.99999% 的分数,(请不要挑剔我的百分比)蓝色组(小数)与红色组(双打)完全不同。
这是因为根据我们对蓝色集合的定义,它是一个以 10 为底的尾数/指数表示,而 double 是一个以 2 为底的尾数/指数表示。任何表示为以 2 为底的尾数和指数(1.00110101001 x 2 ^ (-11101001101001)的值,意味着取尾数值 ( 1.00110101001) 并将其乘以 2 的指数次方(当指数为负时,这相当于除以 2 的绝对值的次方)指数)。这意味着当指数为负时(或尾数的任何部分是二进制小数部分),该数字不能表示为十进制尾数和指数,反之亦然。
对于任何随机落在实数轴上的任意实数,它要么更接近蓝色小数之一,要么更接近红色双精度数之一。
| 归档时间: |
|
| 查看次数: |
2060 次 |
| 最近记录: |