java提高精度问题(斐波那契数列)

六月不远 发布于 2013/08/20 22:01
阅读 669
收藏 3
想把这段代码提高精度,算到1476的时候就不行了,n趋近无穷大的时候,结果应该无线接近黄金分割数的,之前有想过用BigDecimal,可是项数很大的时候F(n)也丢失精度了,不知道怎么弄。 小弟初学java求教,谢谢大家。
public class fibonacci2 {
	 public static void main(String args[])
	 {
		 double n = 1000;
		 double nums = fibonacci(n);
		 double nums_1 = fibonacci(n-1);
		 double nums_2 = nums_1/nums;
		 System.out.println(nums_2);
		 }
	 static double fibonacci(double n)
	 {
		 double a=1,b=1,c;
		 if(n==0) return 0;
		 if(n==1) return 1;
		 if(n==2) return 1;
		 else
		 {
			 for(int i=3;i<=n;i++)
			 {
				 c = a+b;
				 a = b;
				 b = c;
				 }
			 }
		 return (double) b;
		 } 
	 } 
加载中
0
random_walk
random_walk
import java.math.BigDecimal;
import java.math.BigInteger;
import java.math.MathContext;

public class Fib {
	public static void main(String[] args) {

		int n = 1000;
		BigDecimal d1 = new BigDecimal(fibonacci(n));
		BigDecimal d2 = new BigDecimal(fibonacci(n - 1));
		System.out.println(d2.divide(d1, new MathContext(100)));
	}

	static BigInteger fibonacci(int n) {
		BigInteger a = BigInteger.ONE;
		BigInteger b = BigInteger.ONE;
		BigInteger c = BigInteger.ONE;

		if (n < 3)
			return BigInteger.ONE;

		for (int i = 3; i <= n; i++) {
			c = a.add(b);
			a = b;
			b = c;
		}
		return c;
	}

}


Output: 0.6180339887498948482045868343656381177203091798057628621354486227
052604628189024497072072041893911375


和Mathematica计算结果一致,


六月不远
六月不远
非常感谢~~~嘿嘿
0
小耶果
小耶果
这不是精度问题,这是位宽的限制问题.用分而治之法吧.比如分段计算,合并打印等.
六月不远
六月不远
回复 @中山野鬼 : 哦,我去找找看~~~Thx
中山野鬼
中山野鬼
回复 @六月不远 : 大数的计算方法。外面有类似实现代码。java不知道,c语言就是分分钟的事情。。。
六月不远
六月不远
能提供具体的思路吗?算的时候怎么分段计算。
0
朱坤朋
朱坤朋
你说的精度是这个吗?BigDecimal专门搞数学计算的,不会丢失东西。
         BigDecimal nums_2 = nums_1.divide(nums,new MathContext(70));
六月不远
六月不远
哦,可是如果n很大是hi后在nums也就是fabonacci(n)的时候就已经丢失后面的精度。
0
六月不远
六月不远
非常感谢~~~  嘿嘿
0
戴威
戴威
BigDecimal
0
xue777hua
xue777hua
为啥斐波那契数列的计算方法的参数用double?
0
李德凯
李德凯
这个问题真没关注过,受教了。
返回顶部
顶部