Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用可调用函数实现斐波那契时的静默长溢出_Java_Long Integer_Fibonacci_Integer Overflow_Callable - Fatal编程技术网

Java 使用可调用函数实现斐波那契时的静默长溢出

Java 使用可调用函数实现斐波那契时的静默长溢出,java,long-integer,fibonacci,integer-overflow,callable,Java,Long Integer,Fibonacci,Integer Overflow,Callable,我试图使用可调用函数实现斐波那契序列,并将斐波那契可调用函数的初始值植入3,4,5,6和2000。我得到的结果如下: 35813 -820905900187520670 问题是当我试图计算我的可调用函数中的fib(2000)时。有人能看看我下面提供的代码,看看我的方法哪里出了问题: import java.util.concurrent.*; import java.util.*; class FibonacciGen implements Callable<Long>{

我试图使用可调用函数实现斐波那契序列,并将斐波那契可调用函数的初始值植入3,4,5,6和2000。我得到的结果如下:

35813 -820905900187520670

问题是当我试图计算我的可调用函数中的fib(2000)时。有人能看看我下面提供的代码,看看我的方法哪里出了问题:

import java.util.concurrent.*;
import java.util.*;

class FibonacciGen implements Callable<Long>{
    private Long fib;
    public FibonacciGen(long num){
        this.fib = num;
    }
    public Long call(){
        return calculateFibonacci(fib);
    }

    private long calculateFibonacci(long someNum){
        long firstNum = 0L;
        long secondNum = 1L;
        long counter = 0L;
        while(counter<someNum){
            long fibCalc = secondNum+firstNum;
            firstNum = secondNum;
            secondNum = fibCalc;
            counter= counter+1L;
        }
        return secondNum;
    }   

}

public class FibonacciCallable{
    public static void main(String[] args){
        ExecutorService exec = Executors.newCachedThreadPool();
        ArrayList<Callable<Long>> results = new ArrayList<Callable<Long>>();
        CompletionService<Long> ecs = new ExecutorCompletionService<Long>(exec);
        results.add(new FibonacciGen(3L));
        results.add(new FibonacciGen(4L));
        results.add(new FibonacciGen(5L));
        results.add(new FibonacciGen(6L));
        results.add(new FibonacciGen(2000L));
            try{
                for(Callable<Long> fs:results){
                    ecs.submit(fs);
                }
                System.out.println("Submitted all the tasks");
                int n = results.size();
                for(int i=0;i<n;++i){
                    System.out.println("Taking the first completed task");
                    Long r = ecs.take().get();
                    if(r != null)
                        System.out.println(r);
                    }   


            }
            catch(InterruptedException ex){System.out.println(ex);return;}
            catch(ExecutionException e){System.out.println(e);}
            finally{exec.shutdown();}
        }
}
import java.util.concurrent.*;
导入java.util.*;
类FibonacciGen实现了可调用{
私人长假;
公共菲波纳琴(长数){
this.fib=num;
}
公共长途电话(){
收益率计算(fib);
}
专用长计算器(long someNum){
长firstNum=0L;
长秒数=1L;
长计数器=0L;

虽然(counterJava不会在溢出时抛出异常,只是将值包装起来,这就是为什么会得到奇怪的结果。Fibonacci是一个快速增长的序列,2000。元素远远超过了
long


尝试使用
biginger
,它会给您提供任意精度(显然会以性能为代价)。

我不认为它有任何问题,
long
对于f(2000)来说太小了。您可能会溢出缓冲区,您应该尝试使用
biginger
f(2000)=4.224696333392424*10^417这不适合
长的
。计算fibonacci数是不应该使用多线程的一个完美例子。@PeterLawrey这是不同的,但每个数都是在单个线程中计算的。如果你想继续使用
长的
,但想要“嘈杂”溢出,请尝试。(披露:我为番石榴捐款。)