繁体   English   中英

“双精度浮点格式”的精度如何?

[英]How accurate is “double-precision floating-point format”?

假设使用Java输入

双数

如果我需要使用非常大或非常小的值,它们的精度如何? 我试图阅读双打和浮球的工作原理,但我并没有真正理解它。

对于我的编程入门学期项目,我可能需要使用具有较大价值范围(多个数量级)的不同数字。

假设我创建了一个while循环,

while (number[i-1] - number[i] > ERROR) {
     //does stuff
}

ERROR的限制是否取决于number [i]的大小? 如果是这样,我如何确定ERROR可以减小多少以退出循环?

我知道我的老师在某个时候解释过它,但是我似乎在笔记中找不到它。

ERROR的限制是否取决于number [i]的大小?

是。

如果是这样,我如何确定ERROR可以减小多少以退出循环?

您可以使用Math.nextUp获得“下一个最大”的双Math.nextUp (或使用Math.nextUp获得“下一个最小的” Math.nextDown ),例如

double nextLargest = Math.nextUp(number[i-1]);
double difference = nextLargest - number[i-1];

正如Radiodef指出的那样,您还可以使用Math.ulp直接获得差异:

double difference = Math.ulp(number[i-1]);

(但我认为“下一个最小”没有等效的方法)

如果您不告诉我们您想使用它什么,那么我们只能回答标准知识:Java中的double大约有16位有效数字(即十进制数字系统的数字),并且最小可能的值为4.9 x 10 -324 这完全有可能比您需要的精度更高。

问题中的epsilon值(您称为“错误”)根据您的计算而有所不同,因此没有标准答案,但是如果您对简单的东西使用double而不是对科学要求很高的东西,则使用类似1 x 10 -9 ,您会没事的。

floatdouble基本类型在它们可以存储的数据量方面都受到限制。 但是,如果您想知道这两种类型的最大值,请使用自己喜欢的IDE运行以下代码。

System.out.println(Float.MAX_VALUE);
System.out.println(Double.MAX_VALUE);
  • double数据类型是双精度64位IEEE 754浮点(精度位数可以在15到17个十进制数字之间)。
  • float数据类型是单精度32位IEEE 754浮点(精度数字可以在6到9个十进制数字之间)。

运行上面的代码后,如果您对它们的范围不满意,那么我建议您使用BigDecimal,因为这种类型没有限制(而是您的RAM是限制)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM