浮点计算数值误差及PI的蒙特卡罗近似计算
2013-05-01 02:10
274 查看
看JAVA语言程序设计基础,因为以前学习的都是C++, 总体基本上相似。不过这本书里有几个比较有意思的小地方,比如书中写的最小化数值误差(4.7),书中说在大数之前先增加小数是减少误差的方法。如:
第三种方法优于第四种,因为加大数前先加小数会提高精度。
近似的计算PI的值(4.8.3),画一个长度为2的矩形,中间内接一个圆,则理论上落在圆内的概率为PI/4。用蒙特卡罗模拟随机数落在圆内的点数。判断是否落在圆内,用坐标x^2+y^2 <=1 来判断。
//第一种方法求0.01到1之间递增的数列之和 for(float i = 0.01f; i<= 1.0f; i = i + 0.01f) { sum +=i; } //第二种 for(double i = 0.01; i<= 1.0; i = i + 0.01) { sum +=i; } //第三种 currentValue = 0.01; for(int i = 0; i< 100; i++) { sum += currentValue; currentValue += 0.01; } //第四种 currentValue = 1.0; for(int i = 0; i< 100; i++) { sum += currentValue; currentValue -= 0.01; }
第三种方法优于第四种,因为加大数前先加小数会提高精度。
近似的计算PI的值(4.8.3),画一个长度为2的矩形,中间内接一个圆,则理论上落在圆内的概率为PI/4。用蒙特卡罗模拟随机数落在圆内的点数。判断是否落在圆内,用坐标x^2+y^2 <=1 来判断。
public class ComputeArea { public static void main(String[] args) { final int numPoint = 10000000; int rHitNum = 0; for (int i = 0; i < numPoint; i++) { double x = Math.random() * 2 - 1; double y = Math.random() * 2 - 1; if ((Math.pow(x, 2) + y * y) <= 1) { rHitNum++; } } double pi = 4 * ((double)rHitNum / (double)numPoint); //记得强制类型转化为double再除,书中好像有问题 System.out.printf("the PI is : %f", pi); } }
相关文章推荐
- java 浮点数值计算误差
- 实现js浮点数加、减、乘、除的精确计算(网上很多文章里的方法是不能解决所有js浮点数计算误差的)
- 写出一个程序,接受一个浮点数值,输出该数值的近似整数值。如果小数点后数值大于等于5,向上取整;小于5,则向下取整
- 英尺计算, 浮点误差,单目运算符
- 20171203 计算分数的浮点数值
- 实现js浮点数加、减、乘、除的精确计算(网上很多文章里的方法是不能解决所有js浮点数计算误差的)
- JS浮点数值运算误差解决方法
- Java浮点数float,bigdecimal和double精确计算的精度误差问题总结
- java基本类型(数值范围):浮点的底层表示定义,float计算快一些
- 关于浮点数计算的误差
- aabb的4位平方数问题以及浮点数计算时可能产生的误差
- T1010 计算分数的浮点数值(#Ⅰ- 2 - 1)
- 精确计算浮点(Double)类型数值
- 1-3-05:计算分数的浮点数值
- POJ 3347 Kadj Squares 复杂的线段相交问题。这个题目是计算几何的扩大数据运算的典型应用 有时候扩大数据范围避免浮点误差,这个题就是应用
- 浮点计算中的近似处理问题
- js数值计算的处理,防止精度误差
- Java浮点数float和double精确计算的精度误差问题总结
- Java浮点数float和double精确计算的精度误差问题总结
- 【VBA研究】浮点数计算总是有误差的