所以我正在做这个项目,使用二进制搜索,我必须将值插入公式并检查输出是否大约等于我的键。因为我插入的这个公式与圆的面积有关,所以我需要它大约等于7个小数位的键。
double binarySearch(min, max, key){
int mid;
if(max > min)
{
mid = (1 + (max-min)/2)/1;
if(funtion(mid) == key)
{
return mid;
}
if(function(mid) > key)
{
return binarySearch(min, mid-1, key);
}
if(function(mid) < key)
{
return binarySearch(mid+1, max, key);
}
return -1;
}
}
所以我知道检查if(function(mid)== key)是没有意义的,因为它永远不会完全相等。我只是不确定如何将一个准确的答案返回到7位小数(或大约等于我们的键)。
答案 0 :(得分:2)
有几种可能的方法,一种方法是检查差异是否小于错误,例如:
if(fabs(mid - key) <= 1e-7 ) {
return mid;
}
这仍然不完全正确,因为浮点变量也可以是无限的,NaN
和非正规的。如果你有一个不错的数学库(&gt; = C99),你可以(而且应该)使用islessequal()
代替。
答案 1 :(得分:0)
你可以function(mid) * pow(10, 7)
,它会向左移7位小数。
10.12345678 * 10^7 = 101234567.8
然后,您可以将结果转换为integer
,以便可以忽略剩余的十进制数字。
答案 2 :(得分:-1)
检查答案是否正确到小数点后7位
让我们指定正确到7位小数。是小数点后7位还是7 重要位数?
如果你想在&#34;小数点后面的7个位置&#34;,请考虑@deamentiaemundi。请注意,对于非常小的min,key
,如1e-10,1e-20,这将永远是真的。对于非常大且不同的min,key
,即使是一点点,也总是假的,如1.0e10,1.0000000000001e10。
对于浮点数,通常需要7个重要位数。
然后1234.5678eN
,1234.5679eN
是&#34;正确&#34;无论N
的值是多少,都是7位数。
进一步9.999999999
和10.0
是&#34;正确&#34;到7位数,相差0.000000001。
由于OP正在寻找该区域,我们假设min,key
都是正面的。 (零和混合符号需要额外的代码。
找到相对的差异。
bool close_enough(double min, double key) {
if (min == key) {
return true;
}
if (min < 0.0 != key < 0.0) {
// Handle different signs
// this is usually false, but you may want something different.
return false;
}
double dif_abs = fabs(min - key);
double average = fabs((min + key)/2);
double dif_rel = dif_abs/average;
return (dif_rel <= 1.0e7);
}
其他问题包括Not-a-number,infinity == infinity,0和一个小值,min + key
可能会溢出。但是上面的内容应该开始了。
答案 3 :(得分:-2)
它有点hacky,但您可以使用snprintf()
将浮点值打印为7位小数的字符串,然后使用strncmp()
比较字符串。希望有所帮助。