粗制滥造的蒙特卡洛整合出了更多点的问题
Crude Monte-Carlo integration goes wrong with more points
我正在使用这种粗略的蒙特卡洛积分技术来找出 $\pi$ 的值,并注意到随着采样点数量的增加,积分值稳步偏离实际值。代码为:
#include<iostream>
#include<cmath>
#include<cstdlib>
using namespace std;
float f(float x)//definition of the integrand
{
return sqrt(1-x*x);
}
float rand1()//random number generator between 0 and 1
{
float s=rand();
return s/(RAND_MAX+1.0);
}
float calcint(float xi,float xf,float yi,float yf,float N)//integrator
{
float n=0;
for(int i=0;i<N;i++)
{
float x=(xf-xi)*rand1();float y=(yf-yi)*rand1();
if (y<f(x))
{
n=n+1;
}
}
return n/N*(xf-xi)*(yf-yi);
}
int main()
{
float N=100000000;
for (int i=1; i<N; i=i+N/10)//lists integration value for different sampling
{
cout<<i<<"t"<<4*calcint(0,1,0,1,i)<<endl;
}
return 0;
}
输出是,
10000000 3.14188
20000000 3.14059
30000000 2.23696
40000000 1.67772
50000000 1.34218
60000000 1.11848
70000000 0.958698
80000000 0.838861
90000000 0.745654
为什么会这样?蒙特卡洛积分技术是否保证与更多采样点收敛?
问题是float
类型的精度有限。它有 24 个有效精度位,float
类型可以表示的最大可能整数是16777216而16777217无法表示,因为它需要 25 个有效位(二进制为 1 0000 0000 0000 0000 0000 0001)。在此处查看更多详细信息:IEEE 754 浮点数无法准确表示的第一个整数是哪个?
这意味着当您将 1.0f 添加到 16777216.0f时,结果将是 16777216.0f 而不是 16777217.0f。因此,应使用整数类型而不是浮点类型来计算事件数n
。
相关文章:
- 在我的Quadtree中插入点问题
- Qt - 在课堂上连接 - 出了点问题 - 这个
- 无论如何,避免浮点操作的最大在线点问题
- PCL :PCL可视化工具在同一视口中以不同的颜色显示多点云(XYZ)
- 如何组合同一物体的多点云手动扫描
- 小型学校项目存在多个问题
- 粗制滥造的蒙特卡洛整合出了更多点的问题
- 多点运算符(C 类)
- 平移 - 缩放 - 使用多点触控的轨道 - 虚幻引擎 -
- iPhone中GLSL ES 2.0上多点光源的2D照明
- poll()套接字编程tcp-linux多连接问题
- 傅立叶变换浮点问题
- 未收到Windows多点触摸TOUCHEVENTF_UP
- 多点触控仅检测 2 次点击
- MPI 全对多通信问题
- 只是简单的程序,但出了点问题
- 安卓多点触控事件索引
- 如何使用多点写入ProcessMemory
- Qt 5.5 WebEngineView和多点触控
- c++浮点问题