[生态工具] C语言实现开方数

[复制链接]
 楼主| mikewalpole 发表于 2025-7-25 23:33 | 显示全部楼层 |阅读模式
  1. /********************************************************************
  2. * C 语言实现平方根(开方)计算
  3. *
  4. * 方法:
  5. *  1. 牛顿迭代法
  6. *  2. 二分查找法
  7. *
  8. * 编译:
  9. *      gcc -o sqrt_calc sqrt_calc.c -lm
  10. * 运行:
  11. *      ./sqrt_calc
  12. ********************************************************************/

  13. #include <stdio.h>
  14. #include <math.h>

  15. /* ---------------------- 牛顿迭代法计算平方根 ---------------------- */

  16. /*
  17. * 函数:sqrt_newton
  18. * 功能:使用牛顿迭代法计算平方根
  19. * 参数:
  20. *      x - 需要计算平方根的数
  21. * 返回:
  22. *      sqrt(x) 的近似值
  23. */
  24. double sqrt_newton(double x) {
  25.     if (x < 0) return -1;  // 负数没有实数平方根
  26.     if (x == 0) return 0;

  27.     double y = x / 2.0;  // 初始猜测值
  28.     double epsilon = 1e-6;  // 计算精度
  29.     while (fabs(y * y - x) > epsilon) {
  30.         y = 0.5 * (y + x / y);  // 迭代计算
  31.     }

  32.     return y;
  33. }

  34. /* ---------------------- 二分查找法计算平方根 ---------------------- */

  35. /*
  36. * 函数:sqrt_binary_search
  37. * 功能:使用二分查找法计算平方根
  38. * 参数:
  39. *      x - 需要计算平方根的数
  40. * 返回:
  41. *      sqrt(x) 的近似值
  42. */
  43. double sqrt_binary_search(double x) {
  44.     if (x < 0) return -1;  // 负数没有平方根
  45.     if (x == 0) return 0;

  46.     double left = (x < 1) ? x : 0;  // 适用于 0<x<1 的情况
  47.     double right = (x < 1) ? 1 : x;
  48.     double mid;
  49.     double epsilon = 1e-6;  // 计算精度

  50.     while (right - left > epsilon) {
  51.         mid = (left + right) / 2.0;
  52.         if (mid * mid > x) {
  53.             right = mid;
  54.         } else {
  55.             left = mid;
  56.         }
  57.     }

  58.     return (left + right) / 2.0;  // 取中间值
  59. }

  60. /* ---------------------- 主函数 ---------------------- */

  61. int main() {
  62.     double num;

  63.     // 输入需要开方的数
  64.     printf("请输入一个非负数:");
  65.     scanf("%lf", &num);

  66.     // 使用牛顿迭代法计算平方根
  67.     double sqrt1 = sqrt_newton(num);
  68.     printf("牛顿迭代法计算 sqrt(%.6f) = %.6f\n", num, sqrt1);

  69.     // 使用二分查找法计算平方根
  70.     double sqrt2 = sqrt_binary_search(num);
  71.     printf("二分查找法计算 sqrt(%.6f) = %.6f\n", num, sqrt2);

  72.     // 使用标准库 sqrt() 计算平方根
  73.     double sqrt3 = sqrt(num);
  74.     printf("标准库 sqrt(%.6f) = %.6f\n", num, sqrt3);

  75.     return 0;
  76. }


您需要登录后才可以回帖 登录 | 注册

本版积分规则

50

主题

1720

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部