我试图确定double类型的最大精度。在此链接Retain precision with double in Java的被接受回答的评论中,@PeterLawrey表示最大精度为15。
如何确定这一点?
我试图确定double类型的最大精度。在此链接Retain precision with double in Java的被接受回答的评论中,@PeterLawrey表示最大精度为15。
如何确定这一点?
double
具有15个小数位的精度。对于具有小数部分的数字,您可以获得比15位更多的小数位表示,因为十进制和二进制分数的不可比性。运行这段代码,观察它在哪里停止。
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
。然后它打印出精度(十进制和二进制)。1.0000 - 0.0001
这个数字,但是你无法表示出1.00000-0.00001
这个数字。在这个例子中,使用四位小数的精度,epsilon为0.0001。epsilon 直接 衡量了浮点精度。只需要转换成二进制即可。(注意:我的结果指数为1.11E-16
表明精度约为15位) - Sci Prog双精度浮点数 double
的最大精度是第一个大于 0 的值。根据 Double 的 Javadoc,这个数字由 Double.MIN_VALUE
表示。你可以按如下方式输出它:
BigDecimal doubleMinVal = BigDecimal.valueOf(Double.MIN_VALUE);
System.out.println(doubleMinVal.toPlainString());
System.out.println(doubleMinVal.toString());
请参考这个IDEOne程序作为示例。
for(double d = 1 ; d > 0 ; d/=2) System.out.println(d);
1
开始(只有1个位),然后除以2(在二进制中向右移位)直到达到最后一位。这个循环打印的最后一个数字是:
4.9E-324