2010-06-16 8 views
11

come posso creare un metodo che restituisce lo sqrt di un dato nunber?Come si calcola la radice quadrata di un numero senza utilizzare i builtin?

Ad esempio: sqrt (16) restituisce 4 e sqrt (5) restituisce 2.3 ...
Sto usando Java e conosco la funzione Math.sqrt() API, ma ho bisogno del metodo stesso.

+2

L'unico motivo che mi viene in mente è compiti a casa, così ho suggerito thisin i tag. –

+0

Google per "Newton's Method" –

+0

Leggere il libro "Numerical Recipes in C" – Fanatic23

risposta

10

Probabilmente si dovrà fare uso di un metodo di approssimazione.

Dai un'occhiata alla

Methods of computing square roots

+1

+1 per il collegamento – INS

+0

Sebbene questo collegamento possa rispondere alla domanda, è meglio includere qui le parti essenziali della risposta e fornire il link per riferimento . Le risposte di solo collegamento possono diventare non valide se la pagina collegata cambia. - [Dalla recensione] (/ recensione/post di bassa qualità/18304161) –

7

Ecco qualcosa a cui pensare:

Per trovare una radice quadrata, è semplicemente bisogno di trovare un numero che, elevato alla potenza di 2 (anche se solo moltiplicare da solo è molto più semplice a livello di programmazione;)) restituisce l'input.

Quindi, iniziare con una supposizione. Se il prodotto è troppo piccolo, immagina più grande. Se il nuovo prodotto è troppo grande, lo hai ristretto - indovina da qualche parte nel mezzo. Vedete dove sto andando ...

A seconda del bisogno di precisione e/o le prestazioni, ci sono naturalmente un sacco di modi. La soluzione suggerita in questo post non è in alcun modo la migliore in nessuna di queste categorie, ma ti dà un indizio su come andare.

+0

Ciò richiederà comunque molta elaborazione! – ivorykoder

+0

@ivorykoder: certo che lo farà. Ma ci sono molti metodi per scegliere la prossima ipotesi in modo intelligente, al fine di ridurre rapidamente la dimensione dell'intervallo - per lo più si riduce ad essere in grado di escludere il più possibile l'intervallo rimanente, indipendentemente da quale lato della risposta la risposta sia a. –

5

Uno che ho inventato (o reinventato se del caso) è questo:

Successivo Indovinate = ((indovinate) + N)/(2 × Indovina)

Esempio:

radice quadrata di 10, prima ipotesi è, diciamo, 10:

Guess1 = (100+10)/20=5.5 

Guess2 = (30.25+10)/(2*5.5)= 3.6590909090... 

Guess3 = (13.3889+10)/(3.65909090*2)=3.196005082... 

ecc

ti porta 3.16227766 ... o giù di lì.

Questo è in realtà una versione semplificata del mio metodo originale

Indovina + ((N + Indovinate)/(2 × Indovina))

che sembra un terribile molto come Bakhshali's method.

7

Questa versione utilizza il metodo di Newton, il metodo più comune di calcolo sqrt, e non controllerà che l'ingresso è in realtà un intero, ma dovrebbe risolvere il problema più che bene.

int num = Integer.parseInt(input("Please input an integer to be square rooted.")); 
while(0.0001 < Math.abs(guess * guess - num)){ 
    guess = (guess + num/guess)/2; 
} 
output(Integer.toString(guess)); 

La seconda riga controlla quanto è vicina l'ipotesi corrente al risultato vero e se abbastanza vicino interrompe il ciclo.La terza riga usa il metodo di Newton per avvicinarsi sempre di più al vero valore di sqrt. Spero che aiuti. :)

12

programma Java per scoprire la radice quadrata di un dato numero senza l'utilizzo di funzioni built-in

public class Sqrt 
{ 

    public static void main(String[] args) 
    { 
    //Number for which square root is to be found 
    double number = Double.parseDouble(args[0]); 

    //This method finds out the square root 
    findSquareRoot(number); 

} 

/*This method finds out the square root without using 
any built-in functions and displays it */ 
public static void findSquareRoot(double number) 
{ 

    boolean isPositiveNumber = true; 
    double g1; 

    //if the number given is a 0 
    if(number==0) 
    { 
     System.out.println("Square root of "+number+" = "+0); 
    } 

    //If the number given is a -ve number 
    else if(number<0) 
    { 
     number=-number; 
     isPositiveNumber = false; 
    } 

    //Proceeding to find out square root of the number 
    double squareRoot = number/2; 
    do 
    { 
     g1=squareRoot; 
     squareRoot = (g1 + (number/g1))/2; 
    } 
    while((g1-squareRoot)!=0); 

    //Displays square root in the case of a positive number 
    if(isPositiveNumber) 
    { 
     System.out.println("Square roots of "+number+" are "); 
     System.out.println("+"+squareRoot); 
     System.out.println("-"+squareRoot); 
    } 
    //Displays square root in the case of a -ve number 
    else 
    { 
     System.out.println("Square roots of -"+number+" are "); 
     System.out.println("+"+squareRoot+" i"); 
     System.out.println("-"+squareRoot+" i"); 
    } 

    } 
}