在午餐休息时间,我们开始讨论double
值类型的精度。小数点后的双精度
我的同事认为,小数点后总是有15位。
在我看来一个也说不上来,因为IEEE 754不作假设 这件事,这取决于在第一1
是二进制 表示。 (即小数点前面的数字的大小也是如此)
怎样才能做出更合格的陈述?
在午餐休息时间,我们开始讨论double
值类型的精度。小数点后的双精度
我的同事认为,小数点后总是有15位。
在我看来一个也说不上来,因为IEEE 754不作假设 这件事,这取决于在第一1
是二进制 表示。 (即小数点前面的数字的大小也是如此)
怎样才能做出更合格的陈述?
正如C# reference所述,在小数点之前或之后,精度为15到16位数(取决于所表示的小数值)。
总之,你是对的,它取决于小数点前后的值。
例如:
12345678.1234567D
//接下来的位右移将得到围捕1234567.12345678D
//接下来的位右移会得到四舍五入另外,试图将double
作为固定十进制值的值不是一个好主意。
只需指出它,这意味着_total_中的15位数字,而不仅仅是_小数点后面。 –
C#双打根据IEEE 754具有53位的有效p(或尾数)和一个11位指数ë,其具有范围-1022和1023之间,因此它们的值是
表示p * 2^e
有效数字在小数点前总是有一位数,所以小数部分的精度是固定的。另一方面,double中的小数点后面的数字也取决于它的指数;指数超过有效数的小数部分位数的数字本身没有小数部分。
What Every Computer Scientist Should Know About Floating-Point Arithmetic可能是关于此主题最广泛认可的出版物。
你俩都是错的。正常的double
具有53位的位的精度。这大致相当于16位十进制数字,但考虑到double
值就像小数点一样,导致混淆不清,最好避免。也就是说,你比你的同事更接近正确 - 精确度与所表示的价值相关;足够大double
s有否精度的小数位。
例如,下一个大于4503599627370496.0
的双倍数是4503599627370497.0
。
你用绝对术语还是科学记数法推理?你会如何考虑一个数字,如0.001e5? –
我们正在谈论这一点。我的同事坚持在小数点后有15个地方。我的意见是,你有一个53位的尾数所有地方。但似乎有困难以合格的方式解释这一点。 –
只是为了更清楚一点:这尤其是C#的问题。如果内部C#表示不是IEEE 754,而是小数点后15位,这非常有趣。 –