/* * Evalue les types arithmetiques utilises par la machine. * Sylvain Pion, Octobre 1996. * */ #include #include #include #include int main() { asm volatile ("fldcw %0" : :"m" (_FPU_RC_NEAREST | 0x127f)); /* * Caracteristiques de l'architecture. */ printf("Taille des types (sizeof()):\n"); printf("* char:\t\t%d\n", sizeof(char)); printf("* short:\t%d\n", sizeof(short)); printf("* int:\t\t%d\n", sizeof(int)); printf("* long int:\t%d\n", sizeof(long int)); printf("* long long:\t%d\n", sizeof(long long)); printf("* float:\t%d\n", sizeof(float)); printf("* double:\t%d\n", sizeof(double)); printf("* long double:\t%d\n\n",sizeof(long double)); /* Estimation du nombre de bits mantisse/exposant, des types flottants. */ printf("Type\t\tMantisse\tExposant\tSigne\tTotal\n"); { float a, b; int i, m, e; printf("Float\t\t"); a=1; b=2; m=0; while (b != a) { a *= 2; b = a + 1; m++; }; /* Moins 1 pour le "leading bit". */ m--; printf("%d\t\t", m); a=4; b=2; e=1; while ((a/b) == b) { a *= a; b *= b; e++; }; /* Plus un pour le signe de l'exposant. */ e++; printf("%d\t\t1\t%d\n", e, m+e+1); }; { double a, b; int m, e; printf("Double\t\t"); a=1; b=2; m=0; while (b != a) { a *= 2; b = a+1; m++; }; /* Moins 1 pour le "leading bit". */ m--; printf("%d\t\t", m); a=4; b=2; e=1; while ((a/b) == b) { a *= a; b *= b; e++; }; /* Plus un pour le signe de l'exposant. */ e++; printf("%d\t\t1\t%d\n", e, m+e+1); }; { long double a, b; int m, e; printf("Long Double\t"); a=1; m=0; while (b != a) { a *= 2; b = a+1; m++; }; /* Moins 1 pour le "leading bit". */ m--; printf("%d\t\t", m); a=4; b=2; e=1; while ((a/b) == b) { a *= a; b *= b; e++; }; /* Plus un pour le signe de l'exposant. */ e++; printf("%d\t\t1\t%d\n", e, m+e+1); }; };