c - 使用二进制搜索在 C 中查找数字的平方根

标签 c algorithm math

尝试使用二进制搜索计算数字的平方根,但是我的实现不起作用,我不确定为什么 - 感谢任何帮助,谢谢

这是我的代码。 'end' 是我想要平方根的数字的值

 while(start <= end) {
   float mid = ((start + end) / 2);
   printf("\nhalving mid");

   if(mid * mid == end){
      sqrt = mid;
      printf("\nsqrt = %d", sqrt);
   }
   if(mid * mid < end){
     start = mid + 1;
     sqrt = mid; 
     printf("\nsqrt: %d", sqrt);
   }
   else{
     start = mid - 1;
   }
 }

最佳答案

除了代码中的逻辑问题之外,比较 float 也不是一个好的做法。

mid * mid == end 可能总是会失败,即使是 sqrt(9) 因为 it is very difficult to test floating-point numbers for equality .

使用范围 (epsil) 而不是比较来查看此实现:

static float my_sqrt(float num)
{
    double start = 0.0;
    double end = num;
    double sqrt = 0.0;
    double epsil = 0.000001;

    while (start <= end)
    {
        double mid = ((start + end) / 2);

        sqrt = mid;
        printf("sqrt = %f\n", sqrt);
        if (fabs(mid * mid -num) <= epsil)
        {
            break;
        }
        else if (mid * mid < num)
        {
            start = mid;
        }
        else
        {
            end = mid;
        }
    }
    return sqrt;
}

关于c - 使用二进制搜索在 C 中查找数字的平方根,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40849402/

相关文章:

c++ - glUseProgram() 和 glUseShaderProgram() 有什么区别?

close() 没有正确关闭套接字

C 线程格式化

algorithm - 具有给定元素数的最大子数组

c++ - 如何使用 std::binary_search 或 std::sort 对结构数组进行排序

algorithm - 树中从根到叶子的预期最大路径长度

math - 给定两个数字的 XOR 和 SUM。如何找到数字?

java - 单元测试数学代码

Cortex-M4 锁定

algorithm - 将非十进制数转换为另一个非十进制数