Newsgroup: it.comp.lang.c
Titolo: arrottondamenti

ciao volevo chidere se esiste in c una funzione matematica che mi permetta
di arrotondare i numeri dopo la virgola a seconda della posizione
es.
se tengo 4 decimali
987,1115 = 987,112
con printf sono già riuscito ma io ho due variabli di tipo float
es.
float number1=987,1115
float number2=???
 number2 deve contenere il famoso valore arrotondato ossia number2=987,112
grazie a tutti
-- 
Posted from  [192.106.95.227] 
via Mailgate.ORG Server - 
http://www.Mailgate.ORG

Uhmmmmmmmmm non garantisco per i risultati, ma mi viene in mente una cosa
del genere:
float a = 219,1119;
float b;
char str[20]; // abbondiamo, non si sa mai ;)
sprintf(str, "%.3f", a);
b = (double) atof (str);
E dovremmo essere a posto....
cmq mi salta subito all'occhio il problema di float e double: infatti atof
ritorna un double, quindi potrebbero esserci degli errorini di
arrotondamento in alcune circostanze...
Prova cosi, poi facci sapere!
Ciao, Dome
--
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
PC Brain Official Web Site
http://digilander.iol.it/pcbrain
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

 float a = 219,1119;
qui hai messo la virgola al posto del punto. E la cosa piu' bella e' 
che non e' neppure un errore sintattico!
Anto
-- 
Antonio Cuni, 19 anni, studente
Brainbench C++ Master: 4.6, higher than 98% of all previous test takers.
C Language: 3.32, higher than 79% of all previous test takers.
Guida C/C++ di Programmazione.it: 
http://cpp.programmazione.it

 float a = 219,1119;
e quanto farebbe, secondo te, questa espressione?


Risultato:
   a = 1119
E' questo il bello del C :P  Poi sai quanto tempo per trovare
l'errore? :P
Mox :)

> float a = 219,1119;
Pardon ;) Il codice l'ho scritto direttamente qui senza provare... ;))))
Si vede? ;))))
float a = 219.1119;

 l'errore? :P
Su questo sono d'accordo ;)
-- 
Danilo Piazzalunga
Linux Registered User #245762 at 
http://counter.li.org
mailto:
leo-...@ibero.it

(poi se a qualcuno interessa, il valore dell'espressione e` 1119)
Mea Culpa, non scrivo piu' senza il koenig sotto mano, prometto :)
Mox :)

grazie a tutti
#include <stdio.h>
#include <math.h>
#include <errno.h>
#include <float.h>
int estrai1(const long double x,const int n)
{long double l, k;/*estrae la cifra di posizione n dal duble x */
 k=floor(x*pow(10, -n ));        printf("k=%Lf\n",k);
 l=floor(x*pow(10,-n-1)); l=10*l;printf("k-l=%Lf\n",k-l);
 return k - l;
}
double arrotonda(double x)
{int sign=1, n=-DBL_DIG;
 double y;
 if(x<0){x=-x; sign=-1;}
 if( x-floor(x) == 0) return sign*x;
 if(estrai1(x,n)==9) x=x+pow(10,n); /* problemi arrotond. idem  y<0y>9
il 10% dei numeri ha problemi di arrotond. uno è 2.155 che viene
espanso in 2.1549999999999999999 sembra arbitrariamente*/
 while(n<=-1 && ((y=estrai1(x,n))==0 || y<0 || y>9 ) ) n++;       
 printf("y=%lf n=%d \n",y, n);
 if(y>5)return sign*(x + pow(10,n+1) - y*pow(10,n) );
 else return   sign*(x - y*pow(10,n));
}
void main()
{double b, c, d=2.155;
do{
 printf("\nSi richiede un double (1 termina) >");
 scanf("%lf", &c);
 b=arrotonda(c);
 printf("partenza=%lf\n",c);
 printf("arrivo  =%lf\n",b);
    }while(c!=1);
}

    a = 1119
Attento, il valore, in realta', e' 219.
L'espressione non viene valutata come:
float a = (219, 1119);
ma come:
(float a = 219), 1119;
-- 
Posted from  [80.105.34.80] 


>grazie a tutti
oppure forse
#include <stdio.h>
#include <math.h>
#include <errno.h>
#include <float.h>
int estrai1(long double x,const int n)
{long double l, k;/*estrae la cifra di posizione n dal duble x */
 k=floor(x*pow(10, -n ));        printf("k=%Lf ",k);
 l=floor(x*pow(10,-n-1)); l=10*l;printf("l=%Lf k-l=%Lf\n",l, k-l);
 if(k-l<0 || k-l>9) return 0;
 else if(k-l>0 && k-l<9 && n<-DBL_DIG+5) return 0;
 else return k - l;
}
double arrotonda(double x)
{int sign=1, n=-DBL_DIG;
 double y;
 if(x<0){x=-x; sign=-1;}
 if( x-floor(x) == 0) return sign*x;
 if(estrai1(x,n)==9) x=x+pow(10,n);
 while(n<=-1 && estrai1(x,n)==0 ) n++;       
 y=estrai1(x,n); 
 printf("y=%lf n=%d \n",y, n);
 if(y>5)return sign*(x + pow(10,n+1) - y*pow(10,n) );
 else return   sign*(x - y*pow(10,n));
}
void main()
{double b, c, d=2.155;
do{
 printf("\nSi richiede un double (1 termina) >");
 scanf("%lf", &c);
 b=arrotonda(c);
 printf("partenza=%lf\n",c);
 printf("arrivo  =%lf\n",b);
 }while(c!=1);
}
 dovrebbe funzionare con numeri fino a 6 cifre dopo la virgola (almeno
sul mio pc)

>>grazie a tutti
alla fin fine per approssimare double a partire dalla 6 cifra dopo la
virgola
#include <stdio.h>
#include <math.h>
#include <float.h>
int estrai1(long double x,const int n)
{long double l, k;/*estrae la cifra di posizione n dal duble x */
 k=floor(x*pow(10, -n ));        printf("k=%Lf ",k);
 l=floor(x*pow(10,-n-1)); l=10*l;printf("l=%Lf k-l=%Lf\n",l, k-l);
 if(k-l<0 || k-l>9) return 0;
 else return k - l;
}
double arrotonda(double x)
{int sign=1, n=-DBL_DIG+7;


On Wed, 12 Dec 2001 12:44:54 GMT, k...@kim.kim (kim) wrote:
la funzione arrotonda è patologica (e mi vengono i dubbi anche per
floor() e ... la *moltiplicazione* di particolari numeri tipo 2.155 o
256.568)
 
qualcuno ha qualche suggerimento ?
___________________________________________
#include <math.h>
#include <stdio.h>
#include <float.h>
long double floor1(long double t)
{long double y;
 long int i;
 y=floor(t)-10;
 printf("t=%Lf\n",t);
 for(i=0;i<20;i++,y++) if(y>t)break;
 printf("y=%Lf t=%Lf\n",y,t);
 if(y-t<10e-7) return y;
 else return y-1;
}
int estrai(const double x,const int n)
{long double l, k; /*estrae la cifra di posizione n dal duble x */
 long double floor1(long double);
 k=pow(10, -n ); k=x*k; k=floor1(k);
 l=pow(10,-n-1); l=x*l; l=floor1(l); l=10.0*l; 
 printf("l1=%Lf ",l);printf("k-l=%Lf\n",k-l);
 return k - l;
}
double arrotonda(double x)
{int sign=1, n=-7;
 long double y;
 if(x<0){x=-x; sign=-5;}
 if( x-floor(x) == 0) return sign*x;
 while(n<=-1 && ( (y=estrai(x,n))==0 || y<0 || y>9) ) n++;
 printf("y=%Lf n=%d \n",y, n);
 if(y>=5)return sign*(x + pow(10,n+1) - y*pow(10,n) );
 else    return sign*(x - y*pow(10,n));
}
void main()
{double b, c;
