Java 使用可调用函数实现斐波那契时的静默长溢出
我试图使用可调用函数实现斐波那契序列,并将斐波那契可调用函数的初始值植入3,4,5,6和2000。我得到的结果如下: 35813 -820905900187520670 问题是当我试图计算我的可调用函数中的fib(2000)时。有人能看看我下面提供的代码,看看我的方法哪里出了问题: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>{
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这是不同的,但每个数都是在单个线程中计算的。如果你想继续使用长的,但想要“嘈杂”溢出,请尝试。(披露:我为番石榴捐款。)