2012-12-01 43 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對你的幫助 –