nixp.ru v3.0

23 октября 2017,
понедельник,
16:39:23 MSK

DevOps с компанией «Флант»
Аватар пользователя Feuerbach
Feuerbach написал 1 июля 2005 года в 00:42 (262 просмотра) Ведет себя как мужчина; открыл 53 темы в форуме, оставил 447 комментариев на сайте.


feuerbach@localhost ~/c/math $ cat foo.c
#include 
#include 
short prime(unsigned n)
{
        unsigned i,s;
        if (!(n & 1)) return 0;
        s = (int)sqrt(n);
        for (i=1; (i << 1) + 1<=s;i++)
                if (!(n % ((i << 1)+1))) return 0;
        return 1;
}
int main(void)
{
        printf("%d\n",prime(73));
}
feuerbach@localhost ~/c/math $ cc foo.c
/home/feuerbach/tmp/ccASJQyT.o(.text+0x35): In function `prime':
: undefined reference to `sqrt'
collect2: ld returned 1 exit status
feuerbach@localhost ~/c/math $ c++ foo.c
feuerbach@localhost ~/c/math $

То есть c++ она компилится (и линкуется), а cc — нет. Более того, если sqrt вызывается только из main(), то тоже все оки. В чем прикол?

gcc 3.4.1

rgo


$ cc foo.c -lm
Feuerbach
rgo

$ cc foo.c -lm

Благодарю. А все же, чем принципиально отличаются два случая (когда sqrt вызывается из main и из prime)?

Genie

в случае c++ libm притягивается автоматически, так как она используется в нескольких классах.

разницу в месте использования что-то уловить не могу ;)

ps: а sqrt там, на самом деле, лишнее.. :))

Feuerbach
Genie
ps: а sqrt там, на самом деле, лишнее.. :))

А как без него?..

Genie

вычитанием. вспомни курс математики школной, прогрессии там.. ;)

Feuerbach

Так уж исторически сложилось, что математику я неплохо знаю, а вот с алгоритмами разными и умными я не дружу… Так как же все-таки квадратный корень извлекать вычитанием и прогрессиями?))

Genie

тьху ты блин.

ну, представь, что x(n)=n^2 — это у тебя n-ный член прогрессии (эмм.. точнее ряда).

тогда x(n+1)=(n+1)^2=n^2+2n+1=x(n)+2n+1

остальное додумаешь ;)

Feuerbach

Гы, дошло %) Что-то в этом есть.