2012-12-01 42 views
0

我需要实现浮点在Delphi 7之后发现平方根与给定的计数次数迹象牛顿方法我写了这个代码:这是牛顿 - 拉夫森方法的正确实现吗?

program NewtonMethod 

{$APPTYPE CONSOLE} 

uses 
    SysUtils, Math; 

const 
    signCount = 50; //Signs after floating point count 

var 
    number, curRoot, prevRoot: Extended; 
    precision: Extended; 

function input(): Extended; 
begin 
    Write('x='); 
    try 
    Readln(number) 
    except 
    Writeln('Invalid input data, please try again'); 
    Input(); 
    end; 
end; 

begin 
    input(); 
    curRoot := sqrt(number); //Íà÷àëüíàÿ 
    precision := 1/power(10, signCount); 
    prevRoot := 0; 

    repeat 
    prevRoot := curRoot; 
    curRoot := prevRoot - (Power(prevRoot, 2) - number)/(2 * prevRoot); 
    until 
    Abs(curRoot - prevRoot) < precision; 

    Writeln(curRoot); 
    ReadLn; 
end. 

请回答我的问题:

  • 是这段代码正确吗?
  • 如何以正常(不是指数形式)结果根以所有符号打印?
  • 输入值可能非常大(最多200个符号)。此代码可以与他们合作吗?

并建议我,我该如何改进我的代码?

+0

“最多200个符号”的意思是什么 - 最多200位数字,小数?如果是这样,你将需要使用[BigDecimal类](http://stackoverflow.com/questions/9690133/bcd-math-library-for-arbitrary-big-numbers)。首先让它为小数字工作,然后改为使用大的小数点库。另外马特下面关于你使用sqrt()直接计算平方根的说明是正确的 - 你不应该那样做,因为它已经给你答案了! –

回答

1

curRoot:= sqrt(number); < <看起来像你在这里直接找出数字的平方根,而不是使用方法。

你应该选择一个“第一猜测”使用其他一些方法...如果这仅仅是为了好玩,尝试半数

您可能会发现此页面有用:https://en.wikipedia.org/wiki/Newton%27s_method#Square_root_of_a_number

的扩展数据类型可以只能做大约20个小数位。小数点后200位是一个艰难的通话,可能很难做到

+0

我需要做些什么来处理这么大的数字? – skeeph

+0

对不起,我不太了解Delphi对你的帮助 –