sqrt function () che non funziona con argomenti variabili [duplicato]
-
30-09-2019 - |
Domanda
Questa domanda ha già una risposta qui:
Non so se mi manca qualcosa ovvio, ma sembra che io sono in grado di calcolare le radici quadrate di un variabile in C; la funzione sqrt () sembra solo a lavorare su costanti. Questo è il mio codice:
#include <math.h>
#include <stdio.h>
int main()
{
double a = 2.0;
double b = sqrt(a);
printf("%f", b);
return 0;
}
Quando ho eseguito questo programma, ottengo il seguente errore:
gcc -Wall -o "test2" "test2.c" (in directory: /home/eddy/Code/euler)
/tmp/ccVfxkNh.o: In function `main':
test2.c:(.text+0x30): undefined reference to `sqrt'
collect2: ld returned 1 exit status
Compilation failed.
Tuttavia, se sostituisco l'argomento in sqrt () con una costante come 2.0, ad esempio, (b = sqrt(2.0)
), quindi funziona benissimo. È sqrt () non dovrebbe funzionare con le variabili o qualcosa del genere?
Grazie per l'aiuto
Soluzione
È necessario legame con la libreria matematica (utilizzare un '-lm' sulla riga di comando). Nel caso costante, il compilatore è probabilmente di essere intelligente e precomputing sqrt (2.0) (in modo che il codice che viene compilato è essenzialmente 'b = 1.414 ...;')
Altri suggerimenti
È probabilmente bisogno di aggiungere -lm
quando si compila. Quando si prende la radice quadrata di una costante, il compilatore ottimizza il codice prendendo la radice quadrata mentre compila, quindi non utilizza sqrt
affatto.
Utilizzare il comando gcc -Wall -o "test2" "test2.c" -lm
che probabilmente risolvere il problema.
Questo include la libreria matematica, oltre alla libreria di runtime C standard. Sulla maggior parte dei sistemi, la libreria matematica è storicamente un'entità separata che deve essere esplicitamente richiesto.
In caso di gcc è necessario collegare la libreria.
gcc filename.c -lm.
Tuttavia, in caso di g ++ non c'è bisogno di collegare la libreria in modo questo funzionerà bene:
g ++ filename.c -o filename Una volta che la compilazione è successo.
Per eseguire semplicemente ./filename entrare in G ++. e inserire ./a.out in GCC.
Compila con:
gcc -Wall -o test2 test2.c -lm
È necessario collegare contro la libreria matematica.
includere libreria matematica usando "" operatore
#include " math.h "
programma di compilazione utilizzando l'opzione -lm
per ereditare libreria matematica
Supponiamo che il nostro nome del programma è test.c
la compiliamo come segue
gcc test.c -lm
gcc non collega le librerie standard di default. Quindi non vi resta che fare questo se la compilazione via gcc:
gcc filename.c -lm .
Tuttavia, in caso di g ++ non c'è bisogno di collegare la libreria in modo questo funzionerà bene:
g ++ filename.c -o filename
Questo funziona bene per me. Penso che ci sia qualche problema con ur libreria matematica. Provare il collegamento di nuovo e vedere. Altro codice saggio è del tutto perfetto.