Strona 1 z 1

funkcja obliczająca szereg w języku C

: 18 cze 2023, o 18:53
autor: ania-wera116
Dzień dobry,
mam problem dotyczący poniższego zadania:

Napisz funkcję w języku C: Przy założeniu, że \(\displaystyle{ x}\) jest rzeczywiste obliczyć: \(\displaystyle{ S= \sum_{i=1}^{k}\text{ctgh}\, ix}\).
Należy zdefiniować funkcję: \(\displaystyle{ \text{ctgh}\,ix=\frac{e^{ix}+e^{-ix}}{e^{ix}-e^{-ix}}.}\)

Napisałam taki kod:

Kod: Zaznacz cały

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

float ctgh(float x)
{
    return (exp(x) + exp(-x)) / (exp(x) - exp(-x));
}

float calculateS(int k, float x)
{
    float sum = 0.0;
    
    for (int i = 1; i <= k; i++)
    {
        sum += ctgh(i * x);
    }
    
    return sum;
}

int main()
{
    int i, k;
    float x;
    
    printf("Podaj i: ");
    scanf("%d", &i);
    
    printf("Podaj x: ");
    scanf("%f", &x);
    
    printf("Podaj k: ");
    scanf("%d", &k);
    
    float result = calculateS(k, x);
    
    printf("Wartość S wynosi: %f\n", result);
    
    return 0;
}
Podobno ma być ze zmienną typu float, ale nie wiem tego dokładnie.
Nie bardzo chce się to kompilować.

Proszę o pomoc i ewentualne wskazanie błędów.
Z góry dziękuję
Ania :D

Re: funkcja obliczająca szereg w języku C

: 12 sie 2023, o 08:10
autor: sylvi91
Typy zmiennych są określone poprawnie. Jak na moje oko funkcje są zdefiniowane zgodnie z formułami z zapisu Latex.

Nazywasz plik np. main.c
Kompilujesz w gcc z wiersza poleceń w ten sposób.

dla linux/unix

Kod: Zaznacz cały

gcc -o main main.c -lm
dla windows

Kod: Zaznacz cały

gcc -o main.exe main.c -lm
Musisz zlinkować bibliotekę lm czyli bibiotekę z funkcjami matematycznymi, bo inaczej dostaniesz błąd z powodu nieokreślonej funkcji exp.

Kod: Zaznacz cały

main.c:(.text+0x52): undefined reference to `exp'
Więcej o tym.

Kod: Zaznacz cały

http://web.mit.edu/10.001/Web/Course_Notes/c_Notes/tips_math_library.html

Kod: Zaznacz cały

https://stackoverflow.com/questions/1033898/why-do-you-have-to-link-the-math-library-in-c
Pozdrawiam.

[EDIT:]

Właściwie to funkcja exp zwraca wartośc typu double, a nie float. Double ma ponad dwa razy większą liczbę bitów względem float.
Ale to przy małych zakresach liczb nie robi różnicy w wynikach.