Visualizzazione dei risultati da 1 a 2 su 2
  1. #1

    [C] Problemi con calcolo dell'epsilon macchina ed addizione binaria

    Ho riscontrato dei problemi con queste due function che ho sviluppato:

    Con la prima, si vuole calcolare l'epsilon macchina di un tipo float,double e long double e visualizzarne i rispettivi bits.

    Questo è il codice della function principale:

    codice:
    #include <stdio.h> 
    void extractor_f (long x,char* b);
      void eps_calc () 
    { 
    	union eps_f { 
    	float f;
     	long l;
     	} k; 	
    union esp_d 
    { 
    		long l; 
    		double d;
     		}j;
     	union esp_ld {
     		long long l;
     		long double ld;
     	}h; 
    	char a[64]={0};
     	int i=0,t=0;
     	k.l=0;
     	k.f=1;
     	float somma_f;
     	double somma_d;
     	long double somma_ld;
     	do 	{
     		k.f = k.f/2.0;
     		somma_f = 1.0 + k.f;
     		t++; 	
    }while (somma_f >1); 
    	k.f=k.f*2.0;
     	printf ("%e",k.f);
     	printf ("\n%d",t);
     	printf("\n");
     extractor_f (k.l, a); 
    	k.f=0;
     	j.d=1;
     	t=0;
     	do 	
    { 		
                    j.d = j.d/2.0;
     		somma_d=1.0+j.d; 
    		t++; 	
                    }while (somma_d>1);
     	j.d=j.d*2.0;
     	printf ("%e",j.d);
     	printf ("\n%d",t);
     	printf("\n");
     extractor_f (j.l,a);
     	t=0;
     	h.ld=1;
     	do 	{
     		h.ld = h.ld/2;
     		somma_ld=1.0+h.ld;
     		t++;
     	}while (somma_ld>1);
     	h.ld=h.ld*2.0;
     	printf ("%e",h.ld);
     	printf ("\n%d",t);
     	printf("\n");
     extractor_f (h.l, a); 
    }
    Premetto che questa versione della function è quella che ho provato recentemente (prima ho provato con un unica union e con 1 unica somma della stessa union).

    Questo il codice dell'extractor (estrae i bit e li memorizza in un array di caratteri per poi stamparli)


    I risultati
    codice:
    void extractor_f (long x, char * b) 
    {
     	int i=sizeof (x)*8-1;
     	do  	
           { 		
                    b[i]= x&1; 
     	        x = x>>1;
     		i--; 
            } while (x!=0);
     	printf ("Segno \tEsponente \tMantissa\n\n");
     	for (i=0;i<=64;i++)
     		{ 
    		if (i==1) 
    		{ 	
    		printf ("\t"); 
    		} 		
                    else if (i==9) 	
                  	{ 			
                     printf ("\t");
     		}
     		printf ("%d",b[i]);
      	} 	printf ("\n");
      }
    Ora I risultati delle divisioni della variabile Float e di quella double sono esatti, ma non lo è quello della long double. Ho pensato che fosse dovuto ad un problema della union (spazio condiviso non omogeneo), ma invece mi restituisce lo stesso risultato della variabile double. Quando vado invece ad estrarre i numeri binari, mi restituisce lo stesso risultato per tutte e tre le variabili, senza contare che il risultato è anche errato (01101000 nel campo esponente come risultato)

    L'altro problema l'ho invece riscontrato con una function di addizione binaria che funzioni anche per numeri negativi per complemento a 2 modificando solo l'impostazione della function:

    Questo è il codice della mia function:

    codice:
    void estrattore (int x, int* b, int n);
      int bin_add (int p,int q, int n)
     {
     	int rip=1, sum,count=0,c[32]={0};
     	do
     	{
     	sum = p^q;
     	rip = (p&q) <<1; 	p=sum;
     	q=rip;
     		count++;
     }while (rip >0 && count<=n);
     return  sum;
     }
    Quando chiedevo di effettuare l'addizione algebrica tra un numero negativo ed uno positivo, risultava un numero negativo estremamente inferiore (oltre i -2 miliardi) ed ho pensato ad un overflow e quindi ho innestato nella function una limitazione di numeri di bit (un numero di bit n in imput nella function ed un contatore all'interno del while che determina l'uscita dal while fino a che count <= n) ma continuano ad uscire numeri strani (per n=4 1+(-1) dà -32 in output e ritorna un numero positivo quindi tutto è andato bene). Quindi ho provato a controllare i bit presenti nelle variabili (gli operandi) usando l'estrattore:

    codice:
    void estrattore (int x, int* b, int n) {
     	int j=0;
     	do
     	{
     		b[j]=x&1;
     		j++;
     		x = x>>1;
     	}
     	while ( x !=0 && j>=0);
      		for (j=n-1; j>=0; j--)
     		{
     			printf ("%d", b[j]);
     		}
     	printf ("\n");
     	}
    Ho opportunamente aggiunto un array da passare all'argomento della function, ma quando vado ad estrarre i bit del numero negativo, in output il programma si arresta e mi restituisce un numero negativo

    Vi ringrazio in anticipo per la pazienza, e scusate per il wall of text ^^"

  2. #2
    Nessuno?

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.