Ho fatto un programma che dato un numero double (minore di 1 e maggiore di 0), lo passa a una funzione.
La funzione lo esamina, se minore di 0.5 mette una S (sinistra) in un array di char, se maggiore mette D (destra), e uguale a 0 mette C (centro).
Dopo averlo fatto, la funzione riprende il numero e lo raddoppia, se sfora 1, taglia la parte intera:
Es:
0.8=1.6
Prende solo 0.6, quindi verrà scritto D nell'array.
0.25=S
0.25*2=0.5 (C)
0.5*2=1-1=0 (C) fine, non ci si muove più
il problema è che dopo un po' di cicli, il numero double, perde di precisione es:
0.72*2=1.44
a me restituisce al posto di 0.44 il numero 0.440001
Perchè questi arrotondamenti?
Lo avevo già notato tempo fa scrivendo un programma per bambini che faceva le equivalenze, usando i float, ma non ci avevo dato molto peso.
Questo è un output partendo dal numero 0.33:
XXXX 0.320000
XXXX 0.640000
XXXX 0.280000
XXXX 0.560000
XXXX 0.120000
XXXX 0.240000
XXXX 0.480000
XXXX 0.960000
XXXX 0.920000
XXXX 0.840000
XXXX 0.680000
XXXX 0.360000
XXXX 0.720000
XXXX 0.440000
XXXX 0.880000
XXXX 0.760000
XXXX 0.520000
XXXX 0.040000
XXXX 0.080000
XXXX 0.160000
XXXX 0.320000
XXXX 0.640000
XXXX 0.280000
XXXX 0.560000
XXXX 0.120000
XXXX 0.240000
XXXX 0.480000
XXXX 0.960000
XXXX 0.920000
XXXX 0.840000
XXXX 0.680000
XXXX 0.360000
XXXX 0.720000
XXXX 0.440001
XXXX 0.880001
XXXX 0.760002
XXXX 0.520004
XXXX 0.040009
XXXX 0.080017
XXXX 0.160034
XXXX 0.320068
XXXX 0.640137
XXXX 0.280273
XXXX 0.560547
XXXX 0.121094
XXXX 0.242188
XXXX 0.484375
XXXX 0.968750
XXXX 0.937500
XXXX 0.875000
XXXX 0.750000
XXXX 0.500000
XXXX 0.000000
XXXX 0.000000
XXXX 0.000000
XXXX 0.000000
XXXX 0.000000
XXXX 0.000000
XXXX 0.000000
XXXX 0.000000
XXXX 0.000000
XXXX 0.000000
XXXX 0.000000
XXXX 0.000000
XXXX 0.000000
XXXX 0.000000
XXXX 0.000000
XXXX 0.000000
XXXX 0.000000
XXXX 0.000000
XXXX 0.000000
XXXX 0.000000
XXXX 0.000000
XXXX 0.000000
XXXX 0.000000
XXXX 0.000000
XXXX 0.000000
XXXX 0.000000
XXXX 0.000000
XXXX 0.000000
XXXX 0.000000
XXXX 0.000000
XXXX 0.000000
XXXX 0.000000
XXXX 0.000000
XXXX 0.000000
XXXX 0.000000
XXXX 0.000000
XXXX 0.000000
XXXX 0.000000
XXXX 0.000000
XXXX 0.000000
XXXX 0.000000
XXXX 0.000000
XXXX 0.000000
XXXX 0.000000
XXXX 0.000000
XXXX 0.000000
Codice: Seleziona tutto
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
void particella_uno (char array_1[], double a);
void particella_uno (char array_1[], double a)
{
int i;
for (i=0; i<100; i++)
{
if (a<0.5)
{
array_1[i]='S';
}
if (a>0.5)
{
array_1[i]='D';
}
if (a==0)
{
array_1[i]='C';
}
a=a*2;
if (a>=1)
{
a=a-1;
}
printf ("%lf\n",a);
}
for (i=0; i<100; i++)
printf ("%c",array_1[i]);
return;
}
//***************************************************************
int main(void)
{
double a=0.33;
char array_1[100]={};
particella_uno (array_1,a);
return 0;
} Grazie a tutti


