Skip to content

Commit

Permalink
compute factorial with int, uint, float, double and gmp
Browse files Browse the repository at this point in the history
  • Loading branch information
leolca committed May 30, 2019
1 parent 185f5a3 commit d9cc63c
Showing 1 changed file with 46 additions and 10 deletions.
56 changes: 46 additions & 10 deletions factorial.c
Original file line number Diff line number Diff line change
@@ -1,30 +1,66 @@
#include <stdio.h>
#include<stdlib.h>
#include <stdlib.h>
#include <gmp.h>
#include <assert.h>

double factorial(int n) {
double f = 1;
void gmpfactorial(mpz_t result, int n) {
mpz_set_ui(result,1);
for(int i=1; i < n+1; i++)
f = f*(double)i;
mpz_mul_ui(result,result,i);
}

int intfactorial(int n) {
int f = 1;
for(int i=1; i < n+1; i++)
f = f*i;
return f;
}

uint uintfactorial(int n) {
uint f = 1;
for(int i=1; i < n+1; i++)
f = f*(uint)i;
return f;
}

float ffactorial(int n) {
float floatfactorial(int n){
float f = 1;
for(int i=1; i < n+1; i++)
f = f*(float)i;
return f;
}

double doublefactorial(int n) {
double f = 1;
for(int i=1; i < n+1; i++)
f = f*(double)i;
return f;
}

int main(int argc, char *argv[]) {
int n;
double f;
float ff;
double dfac;
float ffac;
int ifac;
uint uifac;
mpz_t mfrac;
mpz_init(mfrac);

if (argc > 1)
n = atoi( argv[1] );
else
n = 1;
f = factorial(n);
ff = ffactorial(n);
printf("%.0f\t%.0lf\n", ff, f);

dfac = doublefactorial(n);
ffac = floatfactorial(n);
ifac = intfactorial(n);
uifac = uintfactorial(n);
gmpfactorial(mfrac, n);

printf("%d\t%d (%d bits)\t%u (%d bits)\t%.0f (%d bits)\t%.0lf (%d bits)\t", (int) n, ifac, 8*(int) sizeof(int), uifac, 8*(int) sizeof(uint), ffac, 8*(int) sizeof(float), dfac, 8*(int) sizeof(double));
gmp_printf ("%Zd", mfrac);
printf(" (%d bits)\n", 8*(int) sizeof(mfrac));

mpz_clear(mfrac);
return 0;
}

0 comments on commit d9cc63c

Please sign in to comment.