#include <iostream>
#include <cmath>
using namespace std;
template <class T>
bool bisectionInterp(T keys[], T values[], int len, T key, T &value)
{
//数组是由小到大排列的
//超出界限直接返回false
if(key<keys[0] || key>keys[len-1]) return false;
int start, ending;
ending = len - 1;
start = 0;
int middle = len/2;
while(ending >= start)
{
//在两个数之间,差值求结果
if(ending - start == 1)
{
value = (key - keys[start]) / (keys[ending] - keys[start]) *
(values[ending] - values[start]) + values[start];
return true;
}
//恰好等于键值,直接赋值
middle = (ending + start)/2;
if(keys[middle] == key)
{
value = values[middle];
return true;
}
if(keys[middle] > key)
ending = middle; //前提是假设数组是从小到大排序,否则不确定是该加1还是减1
else if(keys[middle] < key )
start = middle;
}
return (-1);
}
int main()
{
double keys[180], values[180];
double key=23.5, value;
for(int i=0; i<180; ++i)
{
keys[i] = double(i);
values[i] = sin(double(i)/180.0*3.1415926);
}
bisectionInterp(keys, values, 180, key, value);
cout << value << endl;
return 0;
}
二分法-线性 插值
最新推荐文章于 2023-03-13 10:32:59 发布