С-программирование sqrt-функции - PullRequest
6 голосов
/ 08 ноября 2010
#include <math.h> 
#include <stdio.h> 

int main(void) 
{ 
    double x = 4.0, result; 

    result = sqrt(x); 
    printf("The square root of %lf is %lfn", x, result); 
    return 0; 
} 

Этот код не работает, потому что он принимает квадратный корень из переменной. Если вы измените sqrt(x) на sqrt(20.0), код будет работать нормально, почему? Пожалуйста, объясните.

Кроме того, как мне получить квадратный корень переменной (что мне действительно нужно)?

ВЫВОД:

matthewmpp@annrogers:~/Programming/C.progs/Personal$ vim sqroot1.c
matthewmpp@annrogers:~/Programming/C.progs/Personal$ cc -c sqroot1.c
matthewmpp@annrogers:~/Programming/C.progs/Personal$ cc -o sqroot1 sqroot1.c
matthewmpp@annrogers:~/Programming/C.progs/Personal$ ./sqroot1
4.472136
matthewmpp@annrogers:~/Programming/C.progs/Personal$ vim sqroot2.c
matthewmpp@annrogers:~/Programming/C.progs/Personal$ cc -c sqroot2.c
matthewmpp@annrogers:~/Programming/C.progs/Personal$ cc -o sqroot2 sqroot2.c
/tmp/ccw2dVdc.o: In function `main':
sqroot2.c:(.text+0x29): undefined reference to `sqrt'
collect2: ld returned 1 exit status
matthewmpp@annrogers:~/Programming/C.progs/Personal$ 

ПРИМЕЧАНИЕ: sqroot1 - это sqroot 20.0. sqroot2 - это sqroot переменной.

matthewmpp@annrogers:~/Programming/C.progs/Personal$ cc -o sqroot2 sqroot2.c -lm
matthewmpp@annrogers:~/Programming/C.progs/Personal$ ./sqroot2
4.472136
matthewmpp@annrogers:~/Programming/C.progs/Personal$ 

решаемая.

Ответы [ 2 ]

35 голосов
/ 08 ноября 2010

Код должен нормально работать, если вы ссылаетесь в соответствующие библиотеки (libc.a и libm.a).Возможно, ваша проблема в том, что вы используете gcc, и вы забыли подключиться в libm.a через -lm, что дает вам неопределенную ссылку на sqrt.GCC вычисляет sqrt(20.0) во время компиляции, потому что это константа.

Попробуйте скомпилировать его с помощью

gcc myfile.c -lm

РЕДАКТИРОВАТЬ: Еще немного информации.Вы можете подтвердить это, посмотрев на сгенерированную сборку, когда вы замените x константой в вызове sqrt.

gcc myfile.c -S

Затем посмотрите на сборку в myfile.s, и вы не увидителиния call sqrt где угодно.

1 голос
/ 14 июля 2011

Вы должны сделать это так:

root@bt:~/Desktop# gcc -lm sqrt.c -o sqrt
root@bt:~/Desktop# ./sqrt
The square root of 4.000000 is 2.000000n
root@bt:~/Desktop# 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...