当前位置: 首页 > 知识库问答 >
问题:

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

金兴朝
2023-03-14

我试图确定double的最大精度是多少。在这个链接中接受的答案的注释中,Java中的Retain precision with double@PeterLawrey声明max precision In 15。

你如何确定这一点?

共有3个答案

陈成济
2023-03-14

您也可以直接“测量”它:

for(double d = 1 ; d > 0 ; d/=2) System.out.println(d);

这种代码的思想是用一位达到最小的数。因此,您从< code>1(只有1位)开始,除以2(在二进制中向右移动位),直到到达最后一位。此循环打印的最后一个数字是:

4.9E-324型

闾丘树
2023-03-14

运行此代码,并查看它在哪里停止

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" );
  }
}

变量y成为不同于1.0的最小值。在我的计算机(Mac英特尔酷睿i5)上,它停在1.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位小数)。在本例中,精度为4位小数,ε为0.0001。ε直接测量浮点精度。转置成二进制就行了。

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

颛孙霖
2023-03-14

@PeterLawrey表示,最大精度为15。

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

double有15个小数位的精度

他错了。它们具有 15 位十进制数字的准确性。

任何数的小数位数都是以10为底的对数。15是log < sub > 10 (253-1)的底值,其中53是尾数的位数(包括隐含位),如Javadoc和IEEE 754中所述,因此2 < sup > 53 -1是最大可能的尾数值。实际值是15.954589770191003298111788092734到Windows计算器的限制。

他把它描述为“精确度的小数位数”是非常错误的。如果精度都在小数点之前,则< code>double具有15位小数。因为十进制和二进制分数的不可公度性,对于有小数部分的数字,十进制表示可以有15位以上的数字。

 类似资料:
  • 问题内容: 我试图确定双精度的最大精度是多少。在此链接的可接受答案的注释中,Java中的double保持精度 @PeterLawrey将max precision设置为15。 您如何确定呢? 问题答案: @PeterLawrey表示最大精度为15。 实际上,这根本不是他所说的。他说的是: 双精度有15个小数位 他错了。它们的精度为15个十进制 数字 。 任何数字中的小数位数由其对数10的对数给出。

  • 以下代码中的几个问题: a)std::numeric_limits::digits10表示什么?b)如果(a)表示在机器上可重新呈现的最大10位双数,那么我们可以通过添加1,2来获得越来越高的精度,然后机器上可重新呈现的最大双数是多少?如何显示?即什么std::numeric_limits::digits10 MaxN?

  • 问题内容: 我正在编写一个简单的Java程序。我需要从输入中获取一个字符串并将其分为两部分:1-double 2-string。然后,我需要对double进行简单的计算,并将结果发送到具有特定精度的输出(4)。它工作正常,但是当输入为0时出现问题,则不能正常工作。 例如,对于这些输入,输出将是: 1公斤 输出:2.2046 3.1公斤 输出:6.8343 但是当输入为0时,输出应为0.0000,但

  • 问题内容: java中双值的乘法运算符的保证精度是多少? 例如,2.2 * 100是220.00000000000003,但是220是双精度数。220.00000000000003是220之后的下一个两倍。 问题答案: 乘法工作正常,但不能精确表示为双精度。最接近的双打是: 2.199999999999999733(0x4001999999999999) 2.200000000000000177(

  • 存储在双精度中的大于2^53的正整数的最大精度误差是多少?换句话说,对于从2^53 1到max(double)的所有正整数,实际整数和双精度值之间的最大精度差是多少。 我问这个问题的一点背景:我正在从pubsub读取SNMP计数器,并将它们写入BigQuery。计数器是UINT64,但BigQuery的整数数据类型是INT64。因此,我目前在BQ模式中使用浮点。对于我的用例来说,如果计数器关闭了数

  • 我正在写一个基于无符号整数的图像类。我目前对8位和16位RGBA像素使用uint8_t和uint16_t缓冲,要从16位转换到8位,我只需将16位值除以std::numeric_limits 但是,如果我想要一个图像,每个RGBA分量都是64位无符号整数(我知道,这个数字高得离谱),我该如何在0和1之间找到一个浮点/双精度数,来表示我的像素值在0和最大uint64_t之间有多远呢?我认为转换为do