| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2467 人关注过本帖
标题:[讨论]如何编写sqrt()
只看楼主 加入收藏
mikewolf
Rank: 1
等 级:新手上路
帖 子:175
专家分:0
注 册:2004-7-3
收藏
 问题点数:0 回复次数:14 
[讨论]如何编写sqrt()

大家谈一谈如何编写sqrt()函数!

double sqrt(double x)

{

....

....

....

}

另外大家在谈一谈如何求一个数的对数!

(不许调用库函数)

double log10(double x) (其中x>0)

{

...

...

...

}

只需要说说你的思想就可以呢!

如果能够给出算法或示例代码更好!

搜索更多相关主题的帖子: sqrt 编写 讨论 
2004-08-30 13:10
kuangjingbo
Rank: 1
等 级:新手上路
帖 子:312
专家分:0
注 册:2004-4-24
收藏
得分:0 

这个是高数中的内容 , 需要知道泰勒级数的相关概念

f(x) = f0(m)(x - m)^0 / 0! + f1(m)(x - m)^1 / 1! + f2(m)(x - m)^2 / 2! + … +fn(m)(x - m)^n / n! + …

其中, fn(m) 用来代表f(X)在m 处的n阶导数,

(x - m)^ n 表示(x - m)的n次方,

n !表示n的阶乘

m是任意实数,不妨取0(只要f(x)在0处n阶可导

那么式子就可以变成:

f(x) = f(0) + f1(0)x ^1 / 1! + f2(0)x^2 / 2! + … +fn(0)x^n / n! + …

举例:

sin(x)= sin(0) + sin1(0) x^1 / 1! +sin2(0) x^2 / 2! + ......+ sinn(0) x^n / n!+.......

由于:sin(0) = sin2(0) =sin4(0) = sin6(0) = sin8(0) = ....... = sin2n(0) =0

   sin1(0) = sin5(0) = sin8(0) = ......=sin4n+1(0) = 1

sin3(0) = sin7(0) =sin11(0) = ...... = sin4n+3(0) = -1

其中n=1,2,3,...........

所以,带入公式的到:

sin(x) = 0 + x + 0 - x^3/3! + 0 + x^5 / 5! +0 - x^7 / 7! + 0 + x^9 /9! + ......

化简得:

sin(x) = x - x^3/3! + x^5 / 5! - x^7 / 7!+ x^9 /9! + ........ + (-1)^n x^(2n+1) / (2n+1)!+........ ,其中n=0,1,2,3......


永不放弃!
2004-08-30 14:43
kuangjingbo
Rank: 1
等 级:新手上路
帖 子:312
专家分:0
注 册:2004-4-24
收藏
得分:0 

所以说,要想求sqrt,就要先知道sqrt的个阶导数

高等数学的内容,我不想占用太大篇幅

另外,提示一下,sqrt可能在0处不可导,那么可以把m换成1.

log10也是一样的!


永不放弃!
2004-08-30 14:46
乌鸦丘比特
Rank: 1
等 级:新手上路
威 望:2
帖 子:625
专家分:0
注 册:2004-7-19
收藏
得分:0 

我觉用得二分法也可以,这样对数学水平要求低些,我想程序也好写些,至于效率,我写个测试一下看。

[此贴子已经被作者于2004-08-30 14:52:38编辑过]


我喜欢创造,一只扑腾着翅膀向天空飞翔的乌鸦
2004-08-30 14:50
Knocker
Rank: 8Rank: 8
等 级:贵宾
威 望:47
帖 子:10454
专家分:603
注 册:2004-6-1
收藏
得分:0 
看到这个“纯数学”的问题,我就头晕。

九洲方除百尺冰,映秀又遭蛮牛耕。汽笛嘶鸣国旗半,哀伤尽处是重生。     -老K
治国就是治吏。礼义廉耻,国之四维。四维不张,国之不国。   -毛泽东
2004-08-30 14:59
kuangjingbo
Rank: 1
等 级:新手上路
帖 子:312
专家分:0
注 册:2004-4-24
收藏
得分:0 

上面应该是比较正宗的做法

但是我们说:算法

算法就是解决问题的方法.只要能解决问题 ,不管复杂度!

下面是我的另一个想法:

#define MAXSQRT (double)1000000000

double sprt(double x)

{

double min = 0;

double max = MAXSQRT ;

double average = (min + max)/2.0;

if(x<0) return -1; //错误,x不能小于0

while(((average*average) - x) != 0.0 )

{

if(((average*average) - x) > 0.0 )

max = average;

else

min = average;

   average = (min + max)/2;

}

return average;

}


永不放弃!
2004-08-30 15:15
mikewolf
Rank: 1
等 级:新手上路
帖 子:175
专家分:0
注 册:2004-7-3
收藏
得分:0 

good!

研究!

2004-08-30 15:17
kuangjingbo
Rank: 1
等 级:新手上路
帖 子:312
专家分:0
注 册:2004-4-24
收藏
得分:0 
关于,MAXSQRT,你最好选一个比较大的数字,使它接近实数的上限

永不放弃!
2004-08-30 15:17
kuangjingbo
Rank: 1
等 级:新手上路
帖 子:312
专家分:0
注 册:2004-4-24
收藏
得分:0 

加上测试程序:

#include "iostream.h" #define MAXSQRT (double)1000000000

double sprt(double x)

{

double min = 0;

double max = MAXSQRT ;

double average = (min + max)/2.0;

if(x<0) return -1; //错误,x不能小于0

while(((average*average) - x) != 0.0 )

{

if(((average*average) - x) > 0.0 )

max = average;

else

min = average; average = (min + max)/2;

}

return average;

}

void main() { double s; s = sprt((double)100); cout<<s<<endl; }


永不放弃!
2004-08-30 15:18
乌鸦丘比特
Rank: 1
等 级:新手上路
威 望:2
帖 子:625
专家分:0
注 册:2004-7-19
收藏
得分:0 

我觉得这个问题还可以写出其它的代码,值得讨论。


我喜欢创造,一只扑腾着翅膀向天空飞翔的乌鸦
2004-08-30 19:01
快速回复:[讨论]如何编写sqrt()
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.061098 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved