如何查看我的答案有多少位数?

时间:2015-03-19 17:08:02

标签: 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, 1, 2,... and with some n(0) given.

3 个答案:

答案 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的小数部分。