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