Szukaj…


Składnia

  • #include <matematyka.h>
  • podwójne pow (podwójne x, podwójne y);
  • float powf (float x, float y);
  • długi podwójny powl (długi podwójny x, długi podwójny y);

Uwagi

  1. Aby połączyć się z biblioteką matematyczną, użyj -lm z flagami gcc.
  2. Przenośny program, który musi sprawdzić błąd funkcji matematycznej, powinien ustawić wartość errno na zero i wykonać następujące wywołanie feclearexcept(FE_ALL_EXCEPT); przed wywołaniem funkcji matematycznej. Po powrocie z funkcji matematycznej, jeśli errno jest niezerowe lub poniższe wywołanie zwraca niezerowy fetestexcept(FE_INVALID | FE_DIVBYZERO | FE_OVERFLOW | FE_UNDERFLOW); następnie wystąpił błąd w funkcji matematycznej. Przeczytaj stronę podręcznika math_error, aby uzyskać więcej informacji.

Reszta zmiennoprzecinkowa podwójnej precyzji: fmod ()

Ta funkcja zwraca pozostałą część zmiennoprzecinkową podziału x/y . Zwrócona wartość ma taki sam znak jak x.

#include <math.h> /* for fmod() */
#include <stdio.h> /* for printf() */

int main(void)
{
    double x = 10.0;
    double y = 5.1;

    double modulus = fmod(x, y);

    printf("%lf\n", modulus); /* f is the same as lf. */

    return 0;
}

Wynik:

4.90000

Ważne: należy używać tej funkcji ostrożnie, ponieważ może ona zwrócić nieoczekiwane wartości z powodu działania wartości zmiennoprzecinkowych.

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

int main(void)
{
    printf("%f\n", fmod(1, 0.1));
    printf("%19.17f\n", fmod(1, 0.1));
    return 0;
}

Wynik:

0.1
0.09999999999999995

Reszta zmiennoprzecinkowa pojedynczej precyzji i długiej podwójnej precyzji: fmodf (), fmodl ()

C99

Funkcje te zwracają pozostałą część zmiennoprzecinkową podziału x/y . Zwrócona wartość ma taki sam znak jak x.

Pojedyncza precyzja:

#include <math.h> /* for fmodf() */
#include <stdio.h> /* for printf() */

int main(void)
{
    float x = 10.0;
    float y = 5.1;

    float modulus = fmodf(x, y);

    printf("%f\n", modulus); /* lf would do as well as modulus gets promoted to double. */
}

Wynik:

4.90000

Podwójna podwójna precyzja:

#include <math.h> /* for fmodl() */
#include <stdio.h> /* for printf() */

int main(void)
{
    long double x = 10.0;
    long double y = 5.1;

    long double modulus = fmodl(x, y);

    printf("%Lf\n", modulus); /* Lf is for long double. */
}

Wynik:

4.90000

Funkcje zasilania - pow (), powf (), powl ()

Poniższy przykładowy kod oblicza sumę serii 1 + 4 (3 + 3 ^ 2 + 3 ^ 3 + 3 ^ 4 + ... + 3 ^ N) przy użyciu rodziny pow () standardowej biblioteki matematycznej.

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

int main()
{
        double pwr, sum=0;
        int i, n;

        printf("\n1+4(3+3^2+3^3+3^4+...+3^N)=?\nEnter N:");
        scanf("%d",&n);
        if (n<=0) {
                printf("Invalid power N=%d", n);
                return -1;
        }

        for (i=0; i<n+1; i++) {
                errno = 0;
                feclearexcept(FE_ALL_EXCEPT);
                pwr = powl(3,i);
                if (fetestexcept(FE_INVALID | FE_DIVBYZERO | FE_OVERFLOW |
                        FE_UNDERFLOW)) {
                        perror("Math Error");
                }
                sum += i ? pwr : 0;
                printf("N= %d\tS= %g\n", i, 1+4*sum);
        }

        return 0;
}

Przykładowe dane wyjściowe:

1+4(3+3^2+3^3+3^4+...+3^N)=?
Enter N:10
N= 0    S= 1
N= 1    S= 13
N= 2    S= 49
N= 3    S= 157
N= 4    S= 481
N= 5    S= 1453
N= 6    S= 4369
N= 7    S= 13117
N= 8    S= 39361
N= 9    S= 118093
N= 10    S= 354289


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow