小数点后双精度

时间:2012-08-23 10:41:29

标签: c# double ieee-754

在午休时间,我们开始讨论double值类型的精确度。

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

在我看来,人们无法分辨,因为IEEE 754没有做出假设 关于这一点,它取决于二进制文件中第一个1的位置 表示。 (即小数点前的数字大小也计算在内)

如何制作更合格的声明?

4 个答案:

答案 0 :(得分:3)

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

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

例如:

  • 12345678.1234567D //右边的下一个数字将向上舍入
  • 1234567.12345678D //右边的下一个数字将向上舍入

完整样本位于:http://ideone.com/eXvz3

此外,尝试将double值视为固定的十进制值并不是一个好主意。

答案 1 :(得分:3)

你错了。正常double具有53 的精度。这大致相当于16位十进制数字,但将double值视为十进制数就不会导致混淆,最好避免使用。

那就是说,你比你的同事更接近正确 - 精确度与所代表的价值相关;足够大的double具有 no 精度的小数位数。

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

答案 2 :(得分:0)

C#双精度表示根据IEEE 754,53位有效数 p (或尾数)和11位指数 e ,其范围在-1022和之间。因此,他们的价值是

p * 2^e

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

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

答案 3 :(得分:0)

由于这是我可以在此主题上找到的关于SO的唯一问题,因此我想对jorgebg's answer进行补充。

根据to this,精度实际上是15-17位数字。一个精度为17位数字的双精度示例为0.92107099070578813(不要问我如何得到该数字:P)