如何确定双精度的最大精度

2022-09-03 02:26:11

我试图确定双精度的最大精度是多少。在此链接中已接受的答案的注释中,在 Java 中保留双精度@PeterLawrey表示最大精度为 15。

您如何确定这一点?


答案 1

@PeterLawrey表示最大精度为 15。

这实际上根本不是他说的。他说的是:

双精度为 15 位小数点后

他错了。它们具有 15 位十进制数字的精度。

任何数字中的小数位数由其以 10 为基数的日志给出。15 是 log10(253-1) 的下限值,其中 53 是尾数(包括隐含位),如 Javadoc 和 IEEE 754 中所述,因此 253-1 是最大可能的尾数值。实际值为 15.954589770191003298111788092734 到 Windows 计算器的限制。

他将其描述为“准确性的小数位”是完全错误的。如果 A 都位于小数点之前,则它们具有 15 位小数位的精度。对于具有小数部分的数字,由于十进制和二进制分数的不相称性,您可以在十进制表示形式中获得超过15位的数字。double


答案 2

运行此代码,并查看其停止位置

public class FindPrecisionDouble {
  static public void main(String[] args) {
    double x = 1.0;
    double y = 0.5;
    double epsilon = 0;
    int nb_iter = 0;
    while ((nb_iter < 1000) && (x != y)) {
        System.out.println(x-y);
        epsilon = Math.abs(x-y);
        y = ( x + y ) * 0.5;
    }
    final double prec_decimal = - Math.log(epsilon) / Math.log(10.0);
    final double prec_binary = - Math.log(epsilon) / Math.log(2.0);
    System.out.print("On this machine, for the 'double' type, ");
    System.out.print("epsilon = " );
    System.out.println( epsilon );
    System.out.print("The decimal precision is " );
    System.out.print( prec_decimal );
    System.out.println(" digits" );
    System.out.print("The binary precision is " );
    System.out.print( prec_binary );
    System.out.println(" bits" );
  }
}

变量成为不同于 的最小值。在我的计算机(Mac Intel Core i5)上,它停止在 。然后,它打印精度(十进制和二进制)。y1.01.1102...E-16

https://en.wikipedia.org/wiki/Machine_epsilon 所述,浮点精度可以用 epsilon 值来估计。它是“最小的数字,当添加到一个时,产生一个与一不同的结果”(我做了一个小的变化:1-e而不是1 + e,但逻辑是相同的)

我将用十进制解释:如果你有一个4位小数的精度,你可以表示1.0000 - 0.0001,但你不能表示数字1.00000-0.00001(你缺少第5个小数)。在此示例中,epsilon 的精度为 4 位小数,为 0.0001。epsilon 直接测量浮点精度。只需转置为二进制。

编辑您的问题问“如何确定...”。您正在搜索的答案更多的是一种解释,而不是确定精度的方法(您接受的答案)。无论如何,对于其他人来说,在机器上运行此代码将确定“double”类型的精度。