LINUX.ORG.RU

[Продолжаю изучать С] Ошибка при работе с pow


0

1

Продолжаю изучать С. Сижу дома, заболел. И наткнулся на задачу. Нужно посчитать сложные проценты. компиляция программы проходит нормально, а на этапе сборки вываливается проблема (я ее внизу дописал в комментарии)

#include <stdio.h>
#include <math.h>

int main(int argc, char **argv)
{
	int year;
	double amount, principal = 100.0, rate = .05;

	printf("%4s%20s\n", "Year", "Amount on Deposit");

	for (year = 1; year <= 10; year++) {
		amount = principal * pow(1.0+rate,year);
		printf("%4d%20.2f\n", year, amount);
	}
	return 0;
}

//hard_rate.c:(.text+0x62): undefined reference to `pow'
//collect2: выполнение ld завершилось с кодом возврата 1
//Сборка завершилась с ошибкой.


как и в прошлый раз буду благодарен за критику и подсказки.

параметр -lm добавь к gcc, заодно можешь ман почитать

lazyklimm ★★★★★
()

gcc -Wall hard_rate.c -lm -o hard_rate

Array
()

А математическую библиотеку (которая по умолчанию сама на линкуется) кто за тебя подключать (линковать) будет?

Ключ для неё тебе уже здесь все написали.

OldFatMan
()
Ответ на: комментарий от OldFatMan

Я что то не пойму:
Скомпилировать: gcc -c «%f»
Сборка: gcc -o «%e» «%f»
Компилятор: mingw32-make.exe
вот это я установил на виндовс у отца на компе, запускается и работает без всяких проблем.
Подскажите куда конкретно в Линуксе (geany) мне надо прописать -lm? Я уже по-разному пробовал.

novichek01
() автор топика
Ответ на: комментарий от novichek01

Ну несколько раз же написали тебе команду компиляции:

gcc -o program_name source_file.c -lm

Здесь -lm - ключ, который сообщает компилятору, что необходимо прилинковать математическую библиотеку, где и содержится нужная тебе функция pow.

OldFatMan
()
Ответ на: комментарий от novichek01

Вот сейчас прямо скопировал твой код и откомпилировал:

[ 02:46:30 ]$ cat hard_rate.c 
#include <stdio.h>
#include <math.h>

int main(int argc, char **argv)
{
	int year;
	double amount, principal = 100.0, rate = .05;

	printf("%4s%20s\n", "Year", "Amount on Deposit");

	for (year = 1; year <= 10; year++) {
		amount = principal * pow(1.0+rate,year);
		printf("%4d%20.2f\n", year, amount);
	}
	return 0;
}

[ 02:46:40 ]$ gcc -o hard_rate hard_rate.c -lm
[ 02:46:59 ]$ ./hard_rate 
Year   Amount on Deposit
   1              105.00
   2              110.25
   3              115.76
   4              121.55
   5              127.63
   6              134.01
   7              140.71
   8              147.75
   9              155.13
  10              162.89
[ 02:47:05 ]$

Всё получилось.

OldFatMan
()

double amount

Плавающая точка для финансов - это неправильно. Только fixed point.

mv ★★★★★
()
Ответ на: комментарий от OldFatMan

Да это пример из Дейтелов, (вы наверное тоже читали эту кннигу?).
Сборка: gcc -o «%e» «%f» -lm вот так все прошло успешно. (повторю что делаю в geany). Всем спасибо за помощь.

novichek01
() автор топика
Ответ на: комментарий от ttnl

спасибо я в след раз учту-). мне имя тут не важно

novichek01
() автор топика
for (year = 1; year <= 10; year++) {
		amount = principal * pow(1.0+rate,year);

А зачем здесь вообще pow использовать?

Это же просто так пишется:

for (year = 1; year <= 10; year++, principal *= (1.0+rate)) {
А чтобы лишних сложений не делать, можно вообще ввести временную переменную, равную rate+1/

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

можно ввести временную переменную, равную rate+1

Компилятор сам выполнит оптимизацию. Нечего приучать засорять код лишними переменными.

geekless ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.