Java “有多准确?”;双精度浮点格式;?

Java “有多准确?”;双精度浮点格式;?,java,double,precision,Java,Double,Precision,比如说,使用java,我键入 双数 如果我需要使用非常大或非常小的值,它们的准确性如何? 我试着读双打和浮球是如何工作的,但我真的不明白 对于我在《编程入门》中的学期项目,我可能需要使用具有大范围值(许多数量级)的不同数字 假设我创建了一个while循环 while (number[i-1] - number[i] > ERROR) { //does stuff } 误差限制是否取决于数字[i]的大小?如果是这样,我如何确定错误有多小才能退出循环 我知道我的老师在某个时候解释过

比如说,使用java,我键入

双数

如果我需要使用非常大或非常小的值,它们的准确性如何? 我试着读双打和浮球是如何工作的,但我真的不明白

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

假设我创建了一个while循环

while (number[i-1] - number[i] > ERROR) {
     //does stuff
}
误差限制是否取决于数字[i]的大小?如果是这样,我如何确定错误有多小才能退出循环


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

如果你不告诉我们你想用它做什么,那么我们只能回答标准知识:java中的双精度大约有16位有效数字,(这是十进制编号系统的数字,)最小可能值为4.9 x 10-324。这很可能比你需要的精度要高得多


你的问题中的ε值(你称之为“误差”)因你的计算而不同,因此没有标准答案,但如果你对简单的东西使用双倍,而不是对高要求的科学东西,只要使用像1 x 10-9这样的东西就可以了。

如果你不告诉我们你想用它做什么,然后我们只能回答标准知识:java中的
double
大约有16个有效数字(即十进制数字系统的数字),最小的可能值是4.9x10-324。这很可能比你需要的精度要高得多

你的问题中的ε值(你称之为“误差”)因你的计算而不同,因此没有标准答案,但如果你对简单的东西使用双倍,而不是对高要求的科学东西使用双倍,只要使用类似于1 x 10-9的东西,您就可以了。

float和double原语类型在可存储的数据量方面都是有限的。但是,如果您想知道这两种类型的最大值,请使用您喜爱的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位十进制数字之间)
运行上述代码后,如果您对它们的范围不满意,我建议您使用它们,因为这种类型没有限制(而是您的RAM有限制)。

float和double原语类型都受到它们可以存储的数据量的限制。但是,如果您想知道这两种类型的最大值,请使用您喜爱的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位十进制数字之间)
运行上面的代码后,如果您对它们的范围不满意,我建议您使用,因为这种类型没有限制(而您的RAM是限制)

误差限制是否取决于数字[i]的大小

如果是这样,我如何确定错误有多小才能退出循环

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

正如所指出的,您也可以直接使用以下方法获得差异:

(但我不认为“次最小”有一个等价的方法)

误差限制是否取决于数字[i]的大小

如果是这样,我如何确定错误有多小才能退出循环

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

正如所指出的,您也可以直接使用以下方法获得差异:


(但我不认为“次最小值”有一个等价的方法。)

我认为,如果你想得到准确的结果,避免出现双舍入问题,最好使用BigDecimal而不是double。可能重复“我试着读了double和float是如何工作的,但我真的不明白。”那么你没有得到什么?如果你不懂,我们该如何解释答案?研究一下每一位计算机科学家都应该知道的浮点运算,@ArthurKushner如果不舍入,你会如何计算1/3的BigDecimal?我想,如果你想得到准确的结果,避免出现双舍五入的情况,最好使用BigDecimal而不是double。可能会出现重复的“我试过读double和float是如何工作的,但我真的不明白。”那么你不明白什么?如果你不懂,我们该如何解释答案?学习每一位计算机科学家都应该知道的关于浮点运算的知识,@ArthurKushner你如何在不舍入的情况下计算1/3的BigDecimal?谢谢我的老师在我刚开始学习时说不要使用IDE,所以现在就在记事本上做所有事情谢谢我的老师在我刚开始学习时说不要使用IDE,所以现在就在记事本上做所有事情你也可以使用
Math.ulp(double)
,它返回一个数字和下一个最大值之间的正距离,也就是说,基本上你在用减法做什么。如果你愿意,可以随意将其添加到你的答案中。你也可以使用
Math.ulp(double)
,它返回一个数字和下一个最大值之间的正距离,也就是基本上你在用减法做什么。可以随意将其添加到你的答案中,如果你愿意的话,我想用它来求磁场
double difference = Math.ulp(number[i-1]);