2016-03-31 163 views

回答

6

@PeterLawrey规定在15

最大精度这实际上不是他的所有规定。他说是:

双重具有精度

的15点数字,他是错的。他们有十进制的数字的准确性。

的十进制数字在任何数目的数目由它的日志提供给基座10图15是日志(2 -1)时,地板值,其中53是尾数的位的数目(包括隐含位),如Javadoc和IEEE 754中所描述的,因此-1是最大可能的尾数值。实际值是15.954589770191003298111788092734到Windows计算器的限制。

他把它描述为'精确的小数位'是完全错误的。 A double具有15位十进制数字的精度为,如果它们全部在小数点之前。对于具有小数部分的数字,由于小数和二进制小数的不可通约性,您可以在小数表示中得到多于15位的数字。

+0

谢谢澄清一下。然而,2^53最大尾数值意味着15位数字? –

+0

任何数字中的小数位数由其日志给出,以10为底。 – EJP

+2

“直线对数参数”仅适用于整数,这也许就是您在上一段中所说的内容。对于浮点,你必须像我这样做一个派生:http://www.exploringbinary.com/number-of-digits-required-for-round-trip-conversions/。对于双打你得到相同的答案(15);对于浮点数,log_10(2^24-1)约为7.22,但最大精度为6.(另请参见http://stackoverflow.com/questions/30688422/is-the-most-significant-decimal-digits-precision - 可以转换为二进制。) –

0

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

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

这段代码的想法是一个单个位达到最小值。所以你从1(它只有1位)开始,除以2(将二进制右移),直到你到达最后一位。由这个循环最后打印的数量是:

4.9E-324

+3

这是如何显示双打有15位数的精度? – assylias

+1

在double中表示的最小值与其最大精度没有任何关系。一个是指数宽度的函数,另一个是尾数宽度的函数。 – EJP

0

运行该代码,并看到它停止

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 Intel Core i5)上,它停在1.1102...E-16。然后打印精度(十进制和二进制)。

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

I'以十进制解释:如果精度为4位小数,则可以表示1.0000-0.0001,但不能表示数字1.00000-0.00001(缺少第5位小数)。在这个例子中,精度为4位小数,epsilon为0.0001。 epsilon直接测量浮点精度。只需转换为二进制。

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

+0

这究竟是什么意图显示? – EJP

+0

它试图找到与浮点精度有关的ε值。请参阅https://en.wikipedia.org/wiki/Machine_epsilon(查看表格中的binary64行) –

+0

他询问浮点精度本身而不是epsilon,他具体询问值15,你根本没有解决。 – EJP

-1

最大精度为double是第一个大于0的值。根据Double的Javadoc,这个数字代表Double.MIN_VALUE。你可以将它输出如下:

BigDecimal doubleMinVal = BigDecimal.valueOf(Double.MIN_VALUE); 
System.out.println(doubleMinVal.toPlainString()); 
System.out.println(doubleMinVal.toString()); 

为例见this IDEOne program

+1

我不认为这是真的。我相信OP希望知道双倍有意义的有效数字的确切数量。最小可能(绝对)双倍值仅是具有最大负指数部分和最小数部分的那个值。 – Paul

+0

您正在将精度与范围混淆,就像这里的其他答案一样。 – EJP