检查答案是否正确到7位小数

时间:2018-06-16 21:50:46

标签: c recursion binary-search approximation

所以我正在做这个项目,使用二进制搜索,我必须将值插入公式并检查输出是否大约等于我的键。因为我插入的这个公式与圆的面积有关,所以我需要它大约等于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位小数(或大约等于我们的键)。

4 个答案:

答案 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.5678eN1234.5679eN是&#34;正确&#34;无论N的值是多少,都是7位数。

进一步9.99999999910.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()比较字符串。希望有所帮助。