学习博客:https://www.cnblogs.com/Miracevin/p/10774831.html
#include<bits/stdc++.h>
typedef double db;
// https://www.luogu.com.cn/problem/P4525
db a,b,c,d,l,r;
inline db readb()
{
int f=1;db x=0;char s=getchar();
for( ;!isdigit(s);s=='-' && (f=-1),s=getchar());
for( ;isdigit(s);x=x*10+s-48,s=getchar());
if( s=='.' ) for( db l=0.1,s=getchar();isdigit(s);x=x+(s-48)*l,l/=10,s=getchar() );
return x*f;
}
inline db f( db x ) // 在[l,r] 定积分收敛的函数
{
return (c*x+d)/(a*x+b); // 函数 注意运算出现 0^5--- nan
}
inline db simpson( db l,db r ) //Simpson公式
{
db mid=(l+r)/2;
return ( f(l)+4*f(mid)+f(r) )*(r-l)/6;
}
db asr( db l, db r,db eps ,db ans )
{
db mid=(l+r)/2;
db ls=simpson(l,mid),rs=simpson(mid,r);
if( fabs(ls+rs-ans)<=15*eps ) return ls+rs+(ls+rs-ans)/15; //确认精度
return asr(l,mid,eps/2,ls)+asr(mid,r,eps/2,rs); //精度不够则递归调用
}
inline db asr( db l,db r,db eps ) { return asr(l,r,eps,simpson(l,r)) ; }
int main()
{
a=readb(),b=readb(),c=readb(),d=readb();
l=readb(),r=readb();
db ans=asr(l,r,1e-6);
printf("%.6lf\n",ans);
}