在午休时间,我们开始讨论double
值类型的精确度。
我的同事认为,小数点后总是有15位。
在我看来,人们无法分辨,因为IEEE 754没有做出假设
关于这一点,它取决于二进制文件中第一个1
的位置
表示。 (即小数点前的数字大小也计算在内)
如何制作更合格的声明?
答案 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)