我想确定双精度的最大精度是多少。在这个链接中接受的答案的评论Retain precision with double in Java @PeterLawrey指出15中的最大精度。如何确定双精度的最大精度
你如何确定这一点?
我想确定双精度的最大精度是多少。在这个链接中接受的答案的评论Retain precision with double in Java @PeterLawrey指出15中的最大精度。如何确定双精度的最大精度
你如何确定这一点?
@PeterLawrey规定在15
最大精度这实际上不是他的所有规定。他说是:
双重具有精度
的15点数字,他是错的。他们有十进制的数字的准确性。
的十进制数字在任何数目的数目由它的日志提供给基座10图15是日志(2 -1)时,地板值,其中53是尾数的位的数目(包括隐含位),如Javadoc和IEEE 754中所描述的,因此-1是最大可能的尾数值。实际值是15.954589770191003298111788092734到Windows计算器的限制。
他把它描述为'精确的小数位'是完全错误的。 A double
具有15位十进制数字的精度为,如果它们全部在小数点之前。对于具有小数部分的数字,由于小数和二进制小数的不可通约性,您可以在小数表示中得到多于15位的数字。
谢谢澄清一下。然而,2^53最大尾数值意味着15位数字? –
任何数字中的小数位数由其日志给出,以10为底。 – EJP
“直线对数参数”仅适用于整数,这也许就是您在上一段中所说的内容。对于浮点,你必须像我这样做一个派生: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 - 可以转换为二进制。) –
运行该代码,并看到它停止
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直接测量浮点精度。只需转换为二进制。
编辑您的问题问“如何确定...”。你所搜索的答案不仅仅是一种确定精确度的方式(与你接受的答案一样)。无论如何,对于其他人来说,在机器上运行此代码将决定“双”类型的精度。
最大精度为double
是第一个大于0的值。根据Double的Javadoc,这个数字代表Double.MIN_VALUE
。你可以将它输出如下:
BigDecimal doubleMinVal = BigDecimal.valueOf(Double.MIN_VALUE);
System.out.println(doubleMinVal.toPlainString());
System.out.println(doubleMinVal.toString());
你看过[重复问题中的链接维基](https://en.wikipedia.org/wiki/Double-precision_floating-point_format)吗? Java使用IEEE 754浮点双打。 –