小数点后双精度
在午休时间,我们开始讨论double
值类型的精度。
我的同事认为,小数点后总是有15个位置。
在我看来,人们无法分辨,因为IEEE 754没有对此做出假设,它取决于第一个1
在二进制表示中的位置。 (即小数点前的数字大小也计算在内)
如何才能做出更合格的陈述?
如C#引用所述,精度在小数点之前或之后为15到16位(取决于所表示的小数值)。
简而言之,你是对的,它取决于小数点前后的值 。
例如:
-
12345678.1234567D
//右边的下一个数字将向上舍入 -
1234567.12345678D
//右边的下一个数字将向上舍入
完整示例: http : //ideone.com/eXvz3
此外,试图将double
值视为固定的十进制值并不是一个好主意。
你错了。 普通double
精度具有53 位精度。 这大致相当于16位十进制数字,但是将double
值视为十进制数会导致混乱的结束,最好避免。
也就是说,你比你的同事更接近正确 – 精确度与所代表的价值相关; 足够大的double
s 没有精度的小数位数。
例如,下一个大于4503599627370496.0
是4503599627370497.0
。
C#double根据IEEE 754表示,具有53位有效数p (或尾数)和11位指数e ,其范围在-1022和1023之间。因此它们的值是
p * 2^e
有效数字始终在小数点前有一位数,因此其小数部分的精度是固定的。 另一方面,double中小数点后的位数也取决于其指数; 指数超过有效数的小数部分中的位数的数字本身没有小数部分。
每个计算机科学家应该知道的关于浮点算术的内容可能是关于这个主题的最广泛认可的出版物。