2012-12-01 1 views
0

J'ai besoin de mettre en œuvre la méthode Newtons pour trouver des racines carrées avec des signes de comptage de comptage donné après virgule flottante en Delphi 7. J'ai écrit ce code:Est-ce une implémentation correcte de la méthode de Newton-Raphson?

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. 

S'il vous plaît, répondez à mes questions:

  • Est ce code est-il correct?
  • Comment imprimer la racine du résultat dans la forme normale (non exponentielle) avec tous les signes?
  • Les valeurs d'entrée peuvent être très grandes (jusqu'à 200 signes). Ce code peut-il fonctionner avec eux? Et me suggérer, comment puis-je améliorer mon code?

+0

Que signifie "jusqu'à 200 signes" - jusqu'à 200 chiffres décimaux? Si c'est le cas, vous devrez utiliser une [classe BigDecimal] (http://stackoverflow.com/questions/9690133/bcd-math-library-for-arbitrary-big-numbers). Commencez par utiliser les petits nombres, puis changez pour utiliser une grande bibliothèque décimale. Aussi la note de Matt ci-dessous à propos de vous calculant directement la racine carrée en utilisant sqrt() est correcte - vous ne devriez pas le faire car cela vous donne déjà la réponse! –

Répondre

1

curRoot: = sqrt (nombre); < < semble que vous travaillez directement sur la racine carrée d'un nombre, sans utiliser de méthode.

Vous devez choisir une « première approximation » en utilisant une autre méthode ... Si cela est juste pour le plaisir, essayez la moitié du nombre

Vous trouverez peut-être cette page utile: https://en.wikipedia.org/wiki/Newton%27s_method#Square_root_of_a_number

Le type de données étendu peut seulement faire environ 20 décimales. 200 décimales est un appel difficile et serait probablement assez difficile à faire

+0

Que dois-je faire pour travailler avec un tel nombre? – skeeph

+0

Je suis désolé, je ne connais pas assez Delphi pour vous aider avec ça –

Questions connexes