Java 如何检查我的答案有多少位数?
我试图通过多次调用一个方法来找到最精确的值。如何检查第n次迭代何时给出精度为8位的值。我的方法每次调用时都返回一个double,但当结果的精度为8位数时,我想停止调用它 例如,如果我调用方法getValue()20次,而在第20次调用时,它的答案是8位数字,那么如何检查答案并停止代码 我的方法太长,无法发布,所以一般的解释就足够了 问题如下: 使用幂法计算Leslie矩阵A的最大特征值。当获得8位精度时,幂法的迭代应停止。Leslie矩阵模型可写成Java 如何检查我的答案有多少位数?,java,algorithm,floating-point,double,iteration,Java,Algorithm,Floating Point,Double,Iteration,我试图通过多次调用一个方法来找到最精确的值。如何检查第n次迭代何时给出精度为8位的值。我的方法每次调用时都返回一个double,但当结果的精度为8位数时,我想停止调用它 例如,如果我调用方法getValue()20次,而在第20次调用时,它的答案是8位数字,那么如何检查答案并停止代码 我的方法太长,无法发布,所以一般的解释就足够了 问题如下: 使用幂法计算Leslie矩阵A的最大特征值。当获得8位精度时,幂法的迭代应停止。Leslie矩阵模型可写成 n(k + 1) = An(k), k = 0
n(k + 1) = An(k), k = 0, 1, 2,... and with some n(0) given.
老实说,我不相信有一个通用的答案。你怎么知道答案7.9999999比8.0(可能是8.00000000000000)更精确?我想这在很大程度上取决于你想解决的问题
double
以这种方式永远不会足够精确。要知道答案的准确性,唯一的方法是对正在进行的操作进行数学分析,并在保证误差小于一定量时停止
然而,如果你知道你的分析会趋于一致,那就有一点小技巧。您可以比较连续的值,并查看差异有多大。下面是一些伪代码:
while(true) {
nextValue = computeNextValue(previousValue);
if(Math.abs(previousValue - nextValue) < ERROR_THRESHOLD) {
break;
}
previousValue = nextValue;
}
while(true){
nextValue=computeNextValue(以前的值);
if(Math.abs(上一个值-下一个值)
@user58697在评论中提出了一个很好的观点:
即使序列收敛,连续差分也可能过早地停止该过程。了解收敛速度至关重要
编写程序时请记住这一点。您可以使用以下方法检查小数部分。以下是完整的代码-
public class FractionCheck{
public static void main(String[] args){
int length1 = findFractionLegth(423423.98476527);
int length2 = findFractionLegth(428294.31231);
System.out.println(length1);
System.out.println(length2);
}
public static int findFractionLegth(double number){
String numberStr = Double.toString(number);
String fractionalStr = numberStr.substring(numberStr.indexOf('.')+1);
return fractionalStr.length();
}
}
findFractionLegth(double number)
方法计算double
的小数部分,我可以发布这么多。哦,我明白了!因此,我需要从数学上计算出我的方法何时能保证答案正好是8位数字?@Shan请务必阅读编辑。第二段比第一段容易得多。忘记我的第一个版本吧,即使序列收敛,连续的差异也可能过早地停止这个过程。知道收敛速度是至关重要的,这是行不通的。假设他的方法返回6.12345678996,正确答案是6.1234567900000。你的方法不会在它应该停止的时候停止。很好的发现。我没有考虑过。