用BigDecimal类实现Fibonacci算法
Fibonacci(N)=Fibonacii(N-1)+Fibonacci(N-2)
其中 Fibonacci(0)=0;Fibonacci(1)=1
用循环或则递归实现Fibonacci算法很简单,这里就不说了,如果要用公式实现的话,需要进行开根号和幂运算,普通的long型号只能精确到小数点之后的16位,这就意味着当N很大的时候由于小数位overflow无法进行精确运算,本人测试当N大于92时候因为数据溢出的原因就与实际结果不一样了,如果小数点后面不是精确16位,而是自己设定的话,那么运算结果会精确到自己的期望值。JAVA为我们提供了BigDecimal这个类,BigDecimal类提供了幂运算,但是没有提供开平方运算,Fibonacci公式中的开平方运算要自己实现。这里主要介绍一下自己是如何实现开平方运算的
private static BigDecimal mysqrt(BigDecimal a, int scale) {
BigDecimal x = new BigDecimal(Math.sqrt(a.doubleValue()),
MathContext.DECIMAL64);
if (scale < 17)
return x;
BigDecimal b2 = new BigDecimal("2");
for (int tempScale = 16; tempScale < scale; tempScale *= 2) {
// x = x - (x * x - a) / (2 * x);
x = x.subtract(x.multiply(x).subtract(a)
.divide(x.multiply(b2), scale, BigDecimal.ROUND_HALF_EVEN));
}
return x;
}
这里用到了牛顿线性迭代算法,如果不明白的话可以在百度搜索。返回的结果是小数点后精确到scale位的数字。
现在把所有代码给出
package com.fujitsu.soft.rad.devsemi.fibonacci3; import java.math.BigDecimal;
import java.math.MathContext; public class Fibonacci { /*
* by l.zhang
*/
public static void main(String[] args) { System.out.println(fibonacci(100)); } /*
* by l.zhang
*/ public static String fibonacci(int i) {// 大きい桁表現すればlong 2動作の問題 if (i < 0 || i > 1000) {
System.out.println("please input a new number ");
return "-1";
} else if (i == 0) { return "0";
} else if (i == 1) {
return "1";
} else {
return siki(i); } } /*
* 公式で計算 i>=2 by l.zhang
*/
private static String siki(int i) { BigDecimal temp1 = mysqrt(new BigDecimal("5.0"), 100);// Math.pow(5.0,
// 0.5)
BigDecimal temp2 = temp1.divide(new BigDecimal("5.0"));// Math.pow(5.0,
// 0.5) / 5.0;
BigDecimal temp3 = new BigDecimal("1.0");
BigDecimal temp4 = temp3.add(temp1);// (1 + Math.pow(5.0, 0.5))
BigDecimal temp5 = temp3.subtract(temp1);// (1 - Math.pow(5.0, 0.5))
BigDecimal temp6 = temp4.divide(new BigDecimal("2.0"));// (1 +
// Math.pow(5.0,
// 0.5)) / 2.0
BigDecimal temp7 = temp5.divide(new BigDecimal("2.0"));// (1 -
// Math.pow(5.0,
// 0.5)) / 2.0
BigDecimal temp8 = temp6.pow(i, new MathContext(100));// Mypow(temp6,
// i);//
// Math.pow((1 +
// Math.pow(5.0, 0.5))
// / 2.0, i) BigDecimal temp9 = temp7.pow(i, new MathContext(100));// Mypow(temp7,
// i);//
// Math.pow((1 -
// Math.pow(5.0, 0.5))
// / 2.0, i);
// double temp2 = Math.pow((1 + Math.pow(5.0, 0.5)) / 2.0, i);
// double temp3 = Math.pow((1 - Math.pow(5.0, 0.5)) / 2.0, i);
BigDecimal temp10 = temp8.subtract(temp9);
BigDecimal result = temp2.multiply(temp10); String str_res = result.toString();
System.out.println(str_res);
int index = str_res.indexOf(".", 0); return str_res.substring(0, index);
// (temp1 * (temp2 - temp3));
} private static BigDecimal mysqrt(BigDecimal a, int scale) { BigDecimal x = new BigDecimal(Math.sqrt(a.doubleValue()),
MathContext.DECIMAL64);
if (scale < 17)
return x; BigDecimal b2 = new BigDecimal("2");
for (int tempScale = 16; tempScale < scale; tempScale *= 2) {
// x = x - (x * x - a) / (2 * x);
x = x.subtract(x.multiply(x).subtract(a)
.divide(x.multiply(b2), scale, BigDecimal.ROUND_HALF_EVEN));
}
return x; } }
用BigDecimal类实现Fibonacci算法的更多相关文章
- 算法笔记--java的BigInteger类及BigDecimal类
引包:import java.math.*; BigInteger类: 可以使用构造方法:public BigInteger(String val),或者valueOf(int)函数,如: BigIn ...
- java中小数的处理:高精度运算用bigDecimal类,精度保留方法,即舍入方式的指定
一. 计算机的小数计算一定范围内精确,超过范围只能取近似值: 计算机存储的浮点数受存储bit位数影响,只能保证一定范围内精准,超过bit范围的只能取近似值. java中各类型的精度范围参见:http: ...
- 用C# BigInteger实现的BigDecimal类,终于可以直接做四则运算了。
https://code.google.com/p/dotnet-big-decimal/ 这是个BigDecimal类的开源项目,支持Operators +, - and *. 俺给改了改,加上了除 ...
- java基础-BigDecimal类常用方法介绍
java基础-BigDecimal类常用方法介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.BigDecimal类概述 我们知道浮点数的计算结果是未知的.原因是计算机二进制 ...
- JAVA集合类简要笔记 - 内部类 包装类 Object类 String类 BigDecimal类 system类
常用类 内部类 成员内部类.静态内部类.局部内部类.匿名内部类 概念:在一个类的内部再定义一个完整的类 特点: 编译之后可生成独立的字节码文件 内部类可直接访问外部类私有成员,而不破坏封装 可为外部类 ...
- Java:利用BigDecimal类巧妙处理Double类型精度丢失
目录 本篇要点 经典问题:浮点数精度丢失 十进制整数如何转化为二进制整数? 十进制小数如何转化为二进制数? 如何用BigDecimal解决double精度问题? new BigDecimal(doub ...
- BigDecimal类
如果需要精确的计算结果,则必须使用BigDecimal类,而且使用BigDecimal类也可以进行大数的操作. //========================================== ...
- Java大数处理类:BigInteger类和BigDecimal类
当我们要处理非常大的数据时,平常用的数据类型已不足以表示,在Java中有两个类BigInteger和BigDecimal分别表示大整数类和大浮点数类,这两个类在理论上只要计算机内存足够大就能够表示无线 ...
- BIgInteger类和BigDecimal类的理解
第一部分: 这两个类位于java.math包内,要使用它们必须在类前面引用该包:import java.math.BigInteger;和import java.math.BigDecimal; Bi ...
随机推荐
- 免费使用的图表控件XML/SWF Charts 5.08
免费使用的图表控件XML/SWF Charts 5.08 http://www.pin5i.com/showtopic-26053.html 10个免费的在线统计图表工具 http://paranim ...
- web2py--------------用web2py写 django的例子 --------建立一个投票应用(3)
我们建立了数据模型,然后这次来进行页面的展示 1.这里是列表页面的 control 这里是dal的语法 只有两行 第一行 是查询出所有问题,也就是问题的id大于0 第二行是返回问题的列表 这里是vie ...
- Python工程文件中的名词解释---Module与Package的区别
当我们在已有的Python工程文件中创建新的内容是,通常会有两种类型文件供你选择---Module和Package,对于初学者来说会搞不清楚这两种文件直接的关系.这里就来解释一下这两者之间的关系. M ...
- Vijos P1062 迎春舞会之交谊舞
题目链接:https://vijos.org/p/1062 题意:输入n(n <= 1500)个女生左边有多少个男生.每个女生都和她左边最近的男生跳舞. 输出每个女生到可以与之跳舞的男生之间有几 ...
- OFBiz进阶之HelloWorld(一)创建热部署模块
创建热部署模块 参考文档 https://cwiki.apache.org/confluence/display/OFBIZ/OFBiz+Tutorial+-+A+Beginners+Developm ...
- CODEVS 3286 火柴排队
[题目描述 Description] 涵涵有两盒火柴,每盒装有 n 根火柴,每根火柴都有一个高度.现在将每盒中的火柴各自排成一列,同一列火柴的高度互不相同,两列火柴之间的距离定义为: ,其中 ai表示 ...
- MVC5 ModelBinder
MVC5 ModelBinder 什么是ModelBinding ASP.NET MVC中,所有的请求最终都会到达某个Controller中的某个Action并由该Action负责具体的处理和响应.为 ...
- NetWorker常用术语
术语 描述 active group 每24小时至少计划备份一次的备份组. Advanced File Type Device (AFTD) 为大容量磁盘设备和并发操作设计的磁盘备份设备配置选项. A ...
- Ubuntu使用apt-get安装本地deb包
我们都喜欢使用apt-get,因为它实在是让我们大大的省心.但是,有时候我们会为网速慢,安装源不好而烦恼,所以我们可能会将一些常用软件包的deb文件保存在本地以备不时之需.当然了使用dpkg也可以直接 ...
- android ExpandableListActivity的使用
package com.example.keKuoZhanLieBiao; import android.app.ExpandableListActivity; import android.os.B ...