C/Zaawansowane operacje matematyczne: Różnice pomiędzy wersjami

Usunięta treść Dodana treść
m →‎produkt ( iloczyn): C/Zaawansowane_operacje_matematyczne#Przekroczenie_zakresu_liczb_całkowitych
Linia 213:
 
Liczba ma 159 cyfr, to więcej niż [[C/Zaawansowane_operacje_matematyczne#całkowitych|zakres dostępnych standardowych liczb całkowitych]]. [[C/Zaawansowane_operacje_matematyczne#Przekroczenie_zakresu_liczb_całkowitych|Przekroczenie zakresu]] powoduje błędny wynik.
 
 
Możemy sprawdzić czy nie będzie przekroczenia zakresu liczb przed wykonaniem działania
<syntaxhighlight lang="c">
#include <stdio.h>
#include <limits.h> // INT_MAX
/*
http://c-faq.com/misc/sd26.html
functions for ``careful'' multiplication.
 
*/
 
int chkmul(int a, int b)
{
int sign = 1;
if(a == 0 || b == 0) return 0;
if(a < 0) { a = -a; sign = -sign; }
if(b < 0) { b = -b; sign = -sign; }
if(INT_MAX / b < a) {
fprintf(stdout,"int overflow\t");
return (sign > 0) ? INT_MAX : INT_MIN;
}
return sign*a*b;
}
 
 
int product(const int m, const int n )
{
int p = 1;
for(int i=m; i<=n; ++i)
{
fprintf(stdout,"i = %d \t", i);
p = chkmul(p,i);
fprintf(stdout,"p = %d \n", p);
}
return p;
}
 
 
 
int main()
{
int p;
int m = 1; // lower index
int n = 100; // upper index
p = product(m,n);
printf("product of integer numbers from %d to %d is %d\n", m, n, p);
}
</syntaxhighlight>
 
 
<syntaxhighlight lang="bash">
gcc p.c -Wall -Wextra
./a.out
i = 1 p = 1
i = 2 p = 2
i = 3 p = 6
i = 4 p = 24
i = 5 p = 120
i = 6 p = 720
i = 7 p = 5040
i = 8 p = 40320
i = 9 p = 362880
i = 10 p = 3628800
i = 11 p = 39916800
i = 12 p = 479001600
i = 13 int overflow p = 2147483647
i = 14 int overflow p = 2147483647
i = 15 int overflow p = 2147483647
i = 16 int overflow p = 2147483647
i = 17 int overflow p = 2147483647
i = 18 int overflow p = 2147483647
i = 19 int overflow p = 2147483647
i = 20 int overflow p = 2147483647
i = 21 int overflow p = 2147483647
i = 22 int overflow p = 2147483647
i = 23 int overflow p = 2147483647
i = 24 int overflow p = 2147483647
i = 25 int overflow p = 2147483647
i = 26 int overflow p = 2147483647
i = 27 int overflow p = 2147483647
i = 28 int overflow p = 2147483647
i = 29 int overflow p = 2147483647
i = 30 int overflow p = 2147483647
i = 31 int overflow p = 2147483647
i = 32 int overflow p = 2147483647
i = 33 int overflow p = 2147483647
i = 34 int overflow p = 2147483647
i = 35 int overflow p = 2147483647
i = 36 int overflow p = 2147483647
i = 37 int overflow p = 2147483647
i = 38 int overflow p = 2147483647
i = 39 int overflow p = 2147483647
i = 40 int overflow p = 2147483647
i = 41 int overflow p = 2147483647
i = 42 int overflow p = 2147483647
i = 43 int overflow p = 2147483647
i = 44 int overflow p = 2147483647
i = 45 int overflow p = 2147483647
i = 46 int overflow p = 2147483647
i = 47 int overflow p = 2147483647
i = 48 int overflow p = 2147483647
i = 49 int overflow p = 2147483647
i = 50 int overflow p = 2147483647
i = 51 int overflow p = 2147483647
i = 52 int overflow p = 2147483647
i = 53 int overflow p = 2147483647
i = 54 int overflow p = 2147483647
i = 55 int overflow p = 2147483647
i = 56 int overflow p = 2147483647
i = 57 int overflow p = 2147483647
i = 58 int overflow p = 2147483647
i = 59 int overflow p = 2147483647
i = 60 int overflow p = 2147483647
i = 61 int overflow p = 2147483647
i = 62 int overflow p = 2147483647
i = 63 int overflow p = 2147483647
i = 64 int overflow p = 2147483647
i = 65 int overflow p = 2147483647
i = 66 int overflow p = 2147483647
i = 67 int overflow p = 2147483647
i = 68 int overflow p = 2147483647
i = 69 int overflow p = 2147483647
i = 70 int overflow p = 2147483647
i = 71 int overflow p = 2147483647
i = 72 int overflow p = 2147483647
i = 73 int overflow p = 2147483647
i = 74 int overflow p = 2147483647
i = 75 int overflow p = 2147483647
i = 76 int overflow p = 2147483647
i = 77 int overflow p = 2147483647
i = 78 int overflow p = 2147483647
i = 79 int overflow p = 2147483647
i = 80 int overflow p = 2147483647
i = 81 int overflow p = 2147483647
i = 82 int overflow p = 2147483647
i = 83 int overflow p = 2147483647
i = 84 int overflow p = 2147483647
i = 85 int overflow p = 2147483647
i = 86 int overflow p = 2147483647
i = 87 int overflow p = 2147483647
i = 88 int overflow p = 2147483647
i = 89 int overflow p = 2147483647
i = 90 int overflow p = 2147483647
i = 91 int overflow p = 2147483647
i = 92 int overflow p = 2147483647
i = 93 int overflow p = 2147483647
i = 94 int overflow p = 2147483647
i = 95 int overflow p = 2147483647
i = 96 int overflow p = 2147483647
i = 97 int overflow p = 2147483647
i = 98 int overflow p = 2147483647
i = 99 int overflow p = 2147483647
i = 100 int overflow p = 2147483647
product of integer numbers from 1 to 100 is 2147483647
 
</syntaxhighlight>
 
Widać że każdy produkt powyżej górnego zakresu=13 jest błędny. Rozwiązaniem jest użycie bibliotek o dowolnej precyzji ( GMP )
 
==Obliczenia numeryczne==