Salve, avrei bisogno di un aiuto.
Dovrei scrivere un programma che mi permetta di calcolare gli epsilon macchina dei float, double e long double e visualizzarne passo dopo passo i bit.
Credo di esserci riuscito a metà. I float mi funzionano perfettamente, i double non riesco a visualizzarne il binario (mi escono tutti 0, ma l'epsilon è corretto) mentre per i long double ho qualche difficoltà. Vi metto l'esercizio qui, spero che qualcuno di voi possa darmi una mano.
Sui long double ho veramente scarse conoscenze e non riesco a gestirli...
codice:/* SLIDE 7 - ESERCIZIO 1 TRACCIA Scrivere delle function C per calcolare rispettivamente l'epsilon macchina della singola, della doppia precisione e della precisione long double, visualizzando ad ogni passo i singoli bit. */ #include <stdio.h> void epsmach_sp (); void epsmach_dp (); void epsmach_ld (); void binario_float (long int x); void binario_double (long int x); union ffloat { float a; double aa; long double aaa; long int la; long long int lla; }eps, epsp1; int main() { printf("Programmazione II - Esercizio 14\n\n"); printf("EPSILON MACCHINA SINGOLA PRECISIONE\n"); epsmach_sp(); printf("\n\nESPILON MACCHINA DOPPIA PRECISIONE\n"); epsmach_dp(); return 0; } void epsmach_sp () { int i=0; eps.a = 1; epsp1.a = eps.a+1; while (epsp1.a > 1) { printf("n=%d\teps+1 = %f = ", i,epsp1.a); binario_float(epsp1.la); eps.a /= 2; epsp1.a = eps.a+1; i++; } eps.a = 2.0f*(eps.a); printf("\nEpsilon singola precisione = %f", eps.a); } void epsmach_dp () { int i=0; eps.aa = 1; epsp1.aa = eps.aa+1; while (epsp1.aa > 1) { printf("n=%d\teps+1 = %f = ", i,epsp1.aa); binario_double(eps.la); eps.aa /= 2; epsp1.aa = eps.aa+1; i++; } eps.aa = 2.0*(eps.aa); printf("\nEpsilon doppia precisione = %f", eps.aa); } void epsmach_ld () { long double epsp1; eps.aaa = 1; epsp1 = eps.aaa+1; while (epsp1 > 1) { printf("EPS = %lle = \n", eps.aaa); eps.aaa /= 2; epsp1 = eps.aaa+1; } eps.aaa = 2.0*(eps.aaa); printf("\nEpsilon long double = %lle", eps.aaa); } void binario_float (long int x) { short i; for(i=0;i<32;i++) { if(i == 1 || i == 9) printf(" "); printf("%ld", (x>>(31-i))&1); } printf("\n"); } void binario_double (long int x) { int i; for(i=0;i<64;i++) { if(i == 1 || i == 12) printf(" "); printf("%ld", (x>>(63-i))&1); } printf("\n"); }

Rispondi quotando