"double-precision floating-point format"的准确性如何?



假设,使用java,我输入

双数;

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

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

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

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

ERROR的限制是否取决于数字的大小[i]?如果是这样,我如何确定 ERROR 可以有多小才能退出循环?

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

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

是的。

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

您可以使用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 x10-324。 这很可能比您需要的精度高得多。

问题中的 epsilon 值(您称之为"ERROR")因您的计算而异,因此没有标准答案,但是如果您使用双精度来处理简单的东西而不是要求很高的科学内容,只需使用 1 x10-9之类的东西,你就会没事的。

浮点型和基元类型在可以存储的数据量方面都有限制。但是,如果您想知道这两种类型的最大值,请使用您喜欢的 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 是限制)。

最新更新