Newsgroup: it.comp.lang.c
Titolo: un piccolo giochino

Cosa stampa questo programmino?
int main(){
	float i;	
	for (i=0; i!=10; i++)
		printf("%f\n", i);
}
Saluti,
Giuseppe

giuseppe ha scritto:

P.S. non vale farlo girare

Cosa stampa questo programmino?
Dei numeri float in sequenza da 0 a 9.
Perché, che cosa dovrebbe stampare?

> Cosa stampa questo programmino?
...
Non ho capito dov'e' il giochino :-(
Giorgio

Andrea Laforgia ha scritto:

Questa è la mia domanda mi pare...
comunque la risposta non è esatta

 }
Data l'ora riporto solo un paio di errori
- i float devono essere usati solo se c'e` 
un motivo valido per usarli (ie se hai una 
struttura molto grande).
- per controllare i cicli for si devono usare 
tipi interi int, char, long et cetera.
- quando fai un test sui tipi reali non devi 
mai usare uguaglianze ma solo diseguaglianze
(ie if (i < (10 - epsilon))...

 
vabbè dai un piccolo indovinello si cade facilmente in trappola ;)

 }
Mi ricorda un esercizio che avevo trovato sul sito di non mi ricordo 
quale casa di software per valutare la conoscenza dei programmatori. 
L'esercizio presentava il codice:
int i;
for (i=10;i>0;i++)
	printf("%d\n",i);
E c'era una risposta multipla su quello che succederebbe in esecuzione. 
La risposta che si aspettavano (in quanto le altre erano palesemente 
false) era:
"Il programma non termina"
...che però io non condivido!
E.

 (ie if (i < (10 - epsilon))...
centrato il problema...
... scommetto che sei un matematico o un fisico ;)
Ciao e complimenti

 ...che però io non condivido!
Basta provare al limite.
Comunque credo avessi ragione tu, terminava e come.
Ma la faccenda nel caso che ho proposto io è un minimo più sottile.

 Ma la faccenda nel caso che ho proposto io è un minimo più sottile.
Beh, l'istruzione "i!=10" fa a pugni con "float i". Però nel caso 
specifico il codice che hai riportato funziona. Con 10 incrementi non 
riesci a mettere in evidenza un errore di arrotondamento. L'hai provato 
almeno?
E.


Ah, no! La questione non è per niente sottile:
float i;
printf("%d\n",i);
è proprio un errore crasso... Nel riscriverlo avevo automaticamente 
corretto il %d in %f...
E.

 }
$ cat > test.c
int main(){
     float i;
     for (i=0; i!=10; i++)
         printf("%f\n", i);
}
$ gcc test.c -o test
test.c: In function 'main':
test.c:5: warning: incompatible implicit declaration of built-in 
function 'printf'
$ ./test
0.000000
1.000000
2.000000
3.000000
4.000000
5.000000
6.000000
7.000000
8.000000
9.000000
$
E.

comunque la risposta non è esatta
C:\Dev-Cpp>gcc main.c -o main.exe
main.c: In function 'main':
main.c:6: warning: incompatible implicit declaration of built-in
function 'print
f'
C:\Dev-Cpp>main


... scommetto che sei un matematico o un fisico ;)
Non necessita essere un matematico o un fisico per sapere che quando
si lavora con i floating-point, le uguaglianze non possono essere
esatte, visti gli errori di rappresentazione. Tuttavia, nel tuo caso,
questo errore non è ricostruibile, per il semplice motivo che partendo
da 0 e incrementando di 1, l'errore di arrotondamento non è
ottenibile.

tipi interi int, char, long et cetera.
Be', mica vero.
Il C è un po' più permissivo di altri linguaggi (il Pascal, ad
esempio, richiede un "ordinal" - quindi un intero o un carattere -
come indice del ciclo) e consente di testare per una condizione
qualsiasi di uscita dal for. Analogamente, la condizione di
avanzamento del ciclo non è necessariamente un incremento di 1, così
come l'inizializzazione può essere qualsiasi espressione.

   
Vero,
Una raffineria,  il senso e' un poco piu' chiaro (questione di gusti) :
for (i=0; i<=10; i++)
     printf("%f\n", i);
}
brix

Andrea Laforgia ha scritto:

forse hai un compilatore a 64 bit? con gcc e con float non termina. 
(provato)
Giuseppe

 
no, pů che altro cosě č corretto.
Giuseppe

?manu* ha scritto:

se rileggi, nel post iniziale ho scritto %f il %d lo hai introdotto tu 
con riferimento al test in cui ti sei inbattuto.


Anche questo non č corretto. L'intenzione č quella di stampare 11 float, 
ma se ci fossero problemi di approssimazione ne verrebbero stampati solo 10.
E.

 forse hai un compilatore a 64 bit? con gcc e con float non termina. 
No. Il codice č stato compilato con gcc su piattaforma a 32 bit.
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 
hai ragione scusa č stato un mio errore nel post iniziale, ho incollato 
in un nuovo messaggio il codice corretto.
Ciao

 ...
In effetti avei dovuto scrivere:
| Nei cicli for controllati da un contatore la
| variabile contatore dovrebbe sempre essere di 
| tipo intero...
E questo perche' i tipi reali necessitano di molte 
precauzioni per essere maneggiati; ad esempio il 
for riportato dell'esempio si dovrebbe scrivere:
double i;
for (i=0;i<=10;i+=0.1)
  printf("%f\n",i)
e questo credo sia un classico esempio per insegnare 
come impiegare i cicli controllati da variabili a 
virgola mobile.

 ...
Per dire tutta la verita` il for del C e` diverso
dai cicli usati negli altri linguaggi; in effetti 
e` un while generalizzato nato per simulare il for
degli altri linguaggi.
E l'esempio riportato e` il piu' classico degli 
esempi su come *NON* si scrive un ciclo for in C.

 esempi su come *NON* si scrive un ciclo for in C.
Se affermi che un contatore deve usare una variabile intera, sono
d'accordo.
Se intendi che un float o un double non devono essere coinvolti in
qualche modo in un for, non sono d'accordo. Un for, proprio perché è
un while mascherato, può contemplare benissimo dei fp.

 qualche modo in un for, ...
No non questo. Solo che a causa della precisione finita quando si usano
numeri a virgola mobile bisogna effettuare i test in un certo modo. Ma è
questa è argomento per i corsi di analisi numerica.

 
No. Questa dovrebbe essere conoscenza comune di ogni programmatore.
Giorgio

 ogni programmatore. 
Da quando "Analisi numerica" non è piú un esame 
obbligatorio?

 obbligatorio?
Da quando frequentare l'università è obbligatorio?


 Da quando frequentare l'università è obbligatorio?
Per diventare programmatore puoi anche frequentare 
la squola ratio eletta ma devi sempre conoscere 
l'analisi numerica.

 l'analisi numerica.
ma i sottothread creati con le motivazioni piu ridicole dell'anno tutte 
questa settimana devono spuntare? un po per dopo le feste non li tenete?

 ... un po per dopo le feste non li tenete?
Non c'è limite alle bassezze che si possono 
raggiungere; arrivati in cantina possiamo 
sempre scavare.
E poi la colpa à di Hitler! :-D

 E poi la colpa è di Hitler! :-D
[X] Godwin's Law
<<As an online discussion grows longer, the probability
of a comparison involving Nazis or Hitler approaches one>>
Complimenti per aver chiuso il thread.
-- 

 l'analisi numerica.
Interessante. Da questa tua affermazione si dovrebbe dedurre che chiunque
non frequenta l'università è destinato a diventare un programmatore della
domenica? O forse bisogna dedurre che studiando l'analisi numerica si
diventa necessariamente dei bravi programmatori?


 l'analisi numerica.
Ci sono molti campi in cui i float non si usano affatto. Immagino quindi 
che sia possibile fare il programmatore senza conoscere l'analisi 
numerica...
E.

 numerica...
Vero che c'è  tantissima programmazione non numerica (probabilmnete la 
maggioranza). Ma a meno di non legarsi una mano dietro la schiena e non 
usare per principio i float  *mai*, se il linguaggio mette a 
disposizione un tipo dati primitivo,   per me  è importante capirne 
tutte le possibilità ed anche le limitazioni.  Questo non mi trasformerà 
  in un analista numerico ma in un programmatore che conosce le 
possibilità  offerte dal linguaggio che usa sì.
Giorgio