2013-07-02 20 views
7

Mi chiedevo perché c'è sqrt (funzione) in C/C++ come si può ottenere lo stesso utilizzandoDifferenza tra sqrt (x) e pow (x, 0,5)

pow(x,0.5); 

come è sqrt(x) diversa per pow(x,0.5) . C'è una ragione specifica per avere la funzione sqrt?

+0

Non penso che ci sia un motivo speciale per questo. Poiché l'operazione di radice quadrata è molto comune e 'sqrt (x)' migliora la leggibilità rispetto a 'pow()'. – GeekFactory

+7

perché c'è una bicicletta quando c'è una bicicletta? –

+1

Perché abbiamo una moltiplicazione quando puoi semplicemente aggiungere un ciclo? –

risposta

10

ho eseguito un test per voi per controllare le prestazioni di sqrt(x) e pow(x,0.5)

1.

for(int i=0;i<100000000;i++) 
    pow(double(i),0.5); 

2.

for(int i=0;i<100000000;i++) 
    sqrt(double(i)); 

prima ha preso circa 20 secondi in cui come secondo uno ha impiegato circa 2 secondi sul mio computer. Quindi le prestazioni sono decisamente migliori. Come altri hanno già menzionato la leggibilità è un'altra ragione.

+0

Ho ottenuto i risultati opposti ... –

+0

In realtà ho eseguito il test 3 volte solo per essere sicuro. Non ho avuto molta variazione. Si prega di controllare di nuovo. – banarun

+1

[Test it] (http://ideone.com/dlwLGR). –

5

Certo, se si pensa solo l'equivalenza matematica ...

Ma in termini di algoritmi per calcolare il risultato, sqrt è specifico per una cosa, mentre pow è generico.

Quindi si potrebbe (giustamente) presumere che sia possibile scrivere una funzione più rapida per sqrt piuttosto che scrivere la funzione generica pow.

5

Ricordo di aver letto da qualche parte che sqrt() è un caso speciale che è garantito dalla specifica IEEE da arrotondare correttamente. Lo guarderò per trovare una fonte. Dovrebbe essere un po 'più veloce, perché deve gestire solo un caso.

Anche se fossero uguali, è bello avere un alias incorporato per una funzione comunemente utilizzata!

Modifica: Secondo l'IEEE-754, si suppone che sia la funzione pow() sia sqrt() siano implementate in modo tale che il valore arrotondato sia la rappresentazione a virgola mobile più vicina possibile al valore reale. Tuttavia, sqrt() dovrebbe essere ancora più veloce.

+0

Vedere http://stackoverflow.com/questions/22259537/ –

Problemi correlati