二进制搜索不收敛 double
Binary search not converging for double
我必须找到一个数的 n 次方根,它通过了一些测试用例,但在一些测试用例中失败了
当 x=0.09 和 n=3 我得到 ans 为 0.09
但预期是 0.448140475。
我无法弄清楚为什么 bs 不起作用请帮忙!
#include <iostream>
#include <vector>
#include<algorithm>
#include<iomanip>
#include<cmath>
using namespace std;
double solve(double x, int n){
int iter=200;
double low=0;
double high=x;
while(iter--){
double mid = (low+high)/2;
double val = pow(mid,n);
cout<<val<<endl;
if(val<x)low=mid;
else high=mid;
}
return low;
}
int main() {
// int t--;
int t;
cin>>t;
while(t--){
double x;
cin>>x;
int n;
cin>>n;
cout<<fixed<<setprecision(12)<<solve(x,n)<<endl;
}
return 0;
}
首先,我假设您正在尝试使用二分法,而不是二进制搜索。
其次,从数学的角度来看,为了找到真正的根,初始二分域应该从一开始就包含根。但是,您的二分域太小,无法包含实际的根。 (对于0
最后,在我看来,这个 post 必须移动到处理数值分析问题的堆栈交换。 (有一个计算科学堆栈交换。)
我必须找到一个数的 n 次方根,它通过了一些测试用例,但在一些测试用例中失败了 当 x=0.09 和 n=3 我得到 ans 为 0.09 但预期是 0.448140475。 我无法弄清楚为什么 bs 不起作用请帮忙!
#include <iostream>
#include <vector>
#include<algorithm>
#include<iomanip>
#include<cmath>
using namespace std;
double solve(double x, int n){
int iter=200;
double low=0;
double high=x;
while(iter--){
double mid = (low+high)/2;
double val = pow(mid,n);
cout<<val<<endl;
if(val<x)low=mid;
else high=mid;
}
return low;
}
int main() {
// int t--;
int t;
cin>>t;
while(t--){
double x;
cin>>x;
int n;
cin>>n;
cout<<fixed<<setprecision(12)<<solve(x,n)<<endl;
}
return 0;
}
首先,我假设您正在尝试使用二分法,而不是二进制搜索。
其次,从数学的角度来看,为了找到真正的根,初始二分域应该从一开始就包含根。但是,您的二分域太小,无法包含实际的根。 (对于0 最后,在我看来,这个 post 必须移动到处理数值分析问题的堆栈交换。 (有一个计算科学堆栈交换。)