我试图通过多次调用方法来找到最精确的值。如何检查第n次迭代何时给出8位精度值。我的方法每次调用它时返回一个double,但是当结果有8位精度时我想停止调用它。
例如,如果我调用方法getValue()20次,并且在第20次它有8位数的答案,我该如何检查答案并停止代码?
我的方法太长而无法发布,所以一般的解释就足够了。
问题如下:
使用幂方法计算Leslie矩阵A的最大特征值。当您获得8位精度时,幂方法的迭代应该停止.Leslie矩阵模型可以写成
n(k + 1) = An(k), k = 0, 1, 2,... and with some n(0) given.
答案 0 :(得分:5)
double
以这种方式永远不会足够精确。了解答案准确性的唯一方法是对您正在进行的操作进行数学分析,并在误差保证小于一定量时停止。
但是,如果你知道你的分析会收敛,那就有一点技巧了。您可以比较连续值,并查看差异有多大。这是一些伪代码:
while(true) {
nextValue = computeNextValue(previousValue);
if(Math.abs(previousValue - nextValue) < ERROR_THRESHOLD) {
break;
}
previousValue = nextValue;
}
@ user58697在评论中提出了一个很好的观点:
即使序列收敛,连续的差异也可能过早地停止过程。了解收敛速度至关重要。
编写程序时请记住这一点。
答案 1 :(得分:1)
老实说,我不相信有一个通用的答案。你怎么知道答案7.9999999比8.0更精确(可能是8.00000000000000)?我猜,这很大程度上取决于你想要解决的问题。
答案 2 :(得分:0)
您可以使用以下hack来检查小数部分。这是完整的代码 -
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
的小数部分。