LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 883|回复: 8

平方根原来可以这么算

[复制链接]
发表于 2005-1-26 13:14:07 | 显示全部楼层 |阅读模式
  1. #include <stdio.h>

  2. double sqrt(double x)
  3. {
  4.   [color=DarkOrange]double[/color] smaller, greater, result;

  5.   smaller = 1.0;

  6.   [color=DarkOrange]if[/color] (x > smaller) {
  7.     greater = x;
  8.   } [color=DarkOrange]else[/color] {
  9.     greater = smaller;
  10.     smaller = x;
  11.   }

  12.   result = greater;

  13.   [color=DarkOrange]if[/color] ( result * result > x ) {
  14.     result = smaller;
  15.   }

  16.   [color=DarkOrange]while[/color] (greater - smaller > .000000001) {     // 此处可以设置为你的精度要求
  17.    [color=DarkOrange] if[/color] ( result * result < x ) {
  18.       smaller = result;
  19.     } [color=DarkOrange]else[/color] {
  20.       greater = result;
  21.     }
  22.     result = (smaller + greater)/2;
  23.   }

  24.   [color=DarkOrange]return[/color] result;
  25. }

  26. int main()
  27. {
  28.   [color=DarkOrange]double[/color] a;

  29.   printf("Please input a number to a:");

  30.   scanf("%lf", &a);

  31.   printf("sqrt(%g) = %g\n", a, sqrt(a));

  32.   [color=DarkOrange]return[/color] 0;
  33. }
复制代码
发表于 2005-1-27 09:12:08 | 显示全部楼层
Post by mikkoyue
  1. #include <stdio.h>

  2. double sqrt(double x)
  3. {
  4.   [color=DarkOrange]double[/color] smaller, greater, result;

  5.   smaller = 1.0;

  6.   [color=DarkOrange]if[/color] (x > smaller) {
  7.     greater = x;
  8.   } [color=DarkOrange]else[/color] {
  9.     greater = smaller;
  10.     smaller = x;
  11.   }

  12. [color=Red] result = greater;

  13.   if( result * result > x ) {
  14.     result = smaller;
  15.   }[/color]
  16.   [color=DarkOrange]while[/color] (greater - smaller > .000000001) {     // 此处可以设置为你的精度要求
  17.    [color=DarkOrange] if[/color] ( result * result < x ) {
  18.       smaller = result;
  19.     } [color=DarkOrange]else[/color] {
  20.       greater = result;
  21.     }
  22.     result = (smaller + greater)/2;
  23.   }

  24.   [color=DarkOrange]return[/color] result;
  25. }

  26. int main()
  27. {
  28.   [color=DarkOrange]double[/color] a;

  29.   printf("Please input a number to a:");

  30.   scanf("%lf", &a);

  31.   printf("sqrt(%g) = %g\n", a, sqrt(a));

  32.   [color=DarkOrange]return[/color] 0;
  33. }
复制代码


红线的地方不就是  result = smaller;   吗? 还是我看错了?

另外,如果参数是负数,这个程序也能返回个实数值来。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-1-27 23:18:17 | 显示全部楼层
谢谢楼上的提醒,当参数是非正数时我忘记考虑了,我只考虑了参数大于0的情况,看来得加一句 if (x < 0) exit(-1); 才行,关于2楼提到的红色的部分,大家就想想吧,目前我也不是十分确定,反正这样是一定不会出错,呵。现在改正如下
[PHP]#include <stdio.h>

double sqrt(double x)
{
  double smaller, greater, result;

  if (x <= 0) exit(-1);

  smaller = 1.0;

  if (x > smaller) {
    greater = x;
  } else {
    greater = smaller;
    smaller = x;
  }

  result = greater;

  if( result * result > x ) {
    result = smaller;
  }
  while (greater - smaller > .000000001) {     // 此处可以设置为你的精度要求
    if ( result * result < x ) {
      smaller = result;
    } else {
      greater = result;
    }
    result = (smaller + greater)/2;
  }

  return result;
}

int main()
{
  double a;

  printf("lease input a number to a:");

  scanf("%lf", &a);

  printf("sqrt(%g) = %g\n", a, sqrt(a));

  return 0;
}[/PHP]

在gcc 3.4.1下编译通过 
回复 支持 反对

使用道具 举报

发表于 2005-1-28 09:09:09 | 显示全部楼层
不如写个不用浮点数实现的,这样更有实用价值一些。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-1-28 11:50:06 | 显示全部楼层
嗯,有道理,努力中。。。
回复 支持 反对

使用道具 举报

发表于 2005-2-1 13:20:28 | 显示全部楼层
seems reinventing wheels
回复 支持 反对

使用道具 举报

发表于 2005-2-2 18:25:15 | 显示全部楼层
笔算的话,我更倾向于连分数逼近。。。

虽然有笔算开方的方法,但连分数逼近方便一点。。
回复 支持 反对

使用道具 举报

发表于 2005-2-13 23:41:40 | 显示全部楼层
不是吧
用乘的啊

我学数值分析的时候好象用什么 牛顿中值定律(?)来逼近的
收敛很快
r*r算法好象差了些....

可惜学得差了些,忘了
回复 支持 反对

使用道具 举报

发表于 2005-2-14 00:27:09 | 显示全部楼层
win98+lcc编译成功,呵呵
回复 支持 反对

使用道具 举报

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

本版积分规则

快速回复 返回顶部 返回列表