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");
}