2012-08-23 95 views
5

在午餐休息时间,我们开始讨论double值类型的精度。小数点后的双精度

我的同事认为,小数点后总是有15位。

在我看来一个也说不上来,因为IEEE 754不作假设 这件事,这取决于在第一1是二进制 表示。 (即小数点前面的数字的大小也是如此)

怎样才能做出更合格的陈述?

+0

你用绝对术语还是科学记数法推理?你会如何考虑一个数字,如0.001e5? –

+0

我们正在谈论这一点。我的同事坚持在小数点后有15个地方。我的意见是,你有一个53位的尾数所有地方。但似乎有困难以合格的方式解释这一点。 –

+0

只是为了更清楚一点:这尤其是C#的问题。如果内部C#表示不是IEEE 754,而是小数点后15位,这非常有趣。 –

回答

3

正如C# reference所述,在小数点之前或之后,精度为15到16位数(取决于所表示的小数值)。

总之,你是对的,它取决于小数点前后的值

例如:

  • 12345678.1234567D //接下来的位右移将得到围捕
  • 1234567.12345678D //接下来的位右移会得到四舍五入

全样本: http://ideone.com/eXvz3

另外,试图将double作为固定十进制值的值不是一个好主意。

+2

只需指出它,这意味着_total_中的15位数字,而不仅仅是_小数点后面。 –

-1

C#双打根据IEEE 754具有53位的有效p(或尾数)和一个11位指数ë,其具有范围-1022和1023之间,因此它们的值是

表示
p * 2^e 

有效数字在小数点前总是有一位数,所以小数部分的精度是固定的。另一方面,double中的小数点后面的数字也取决于它的指数;指数超过有效数的小数部分位数的数字本身没有小数部分。

What Every Computer Scientist Should Know About Floating-Point Arithmetic可能是关于此主题最广泛认可的出版物。

4

你俩都是错的。正常的double具有53位的的精度。这大致相当于16位十进制数字,但考虑到double值就像小数点一样,导致混淆不清,最好避免。也就是说,你比你的同事更接近正确 - 精确度与所表示的价值相关;足够大double s有精度的小数位。

例如,下一个大于4503599627370496.0的双倍数是4503599627370497.0