|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Member
Iscritto dal: Jun 2007
Messaggi: 62
|
[C] Dichiaro float ma assegno un numero reale..
E' un grave errore vero? Mi spiego nel programma che avevo da fare all'esame dovevo leggere un file contentente numeri reali, nella tensione ho fatto confusione ed ho assegnato ad una variabile float il numero reale letto da quel file. Come valuteranno la cosa??
|
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
C'è qualcosa che non mi torna...un float è la rappresentazione di un numero reale...cosa c'è che non va ?
|
|
|
|
|
|
#3 |
|
Moderatore
Iscritto dal: Nov 2003
Messaggi: 16212
|
Se per leggere il numero dal file hai usato fscanf(filepunt,"%f",&var) con var di tipo float, non dovrebbero esserci problemi, perché ci pensa fscanf a convertire la stringa di caratteri che rappresenta il numero, in un valore float da assegnare alla variabile.
Se però hai usato quella sintassi e var era double, allora probabilmente immagazzinerai un valore sbagliato, perché il formattatore corretto per i double è %lf e non %f, e fscanf non reinterpreta automaticamente i puntatori a float come puntatori a double.
__________________
Ubuntu è un'antica parola africana che significa "non so configurare Debian" Scienza e tecnica: Matematica - Fisica - Chimica - Informatica - Software scientifico - Consulti medici REGOLAMENTO DarthMaul = Asus FX505 Ryzen 7 3700U 8GB GeForce GTX 1650 Win10 + Ubuntu Ultima modifica di Ziosilvio : 12-09-2007 alle 16:50. |
|
|
|
|
|
#4 | |
|
Member
Iscritto dal: Jun 2007
Messaggi: 62
|
Quote:
Codice:
if numreale%5==0 |
|
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
No, l'operatore % è utilizzabile solo con operandi di tipo intero.
Comunque te la cavi usando la funzione standard fmod(). http://cppreference.com/stdmath/fmod.html
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
No...quello si fa con la divisione intera.
Per il reale in teoria non lo potresti fare...ogni reale è divisibile per qualunque numero reale o intero (escluso 0). Sicuro che non dovevi leggere un numero intero ? |
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
|
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Perché?
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Perché ci sono i limiti di rappresentabilità...non tutti gli interi all'interno dell'intervallo di rappresentabilità sono rappresentabili su un double, ancor più su un float.
Ad esempio: Codice:
#include <stdio.h>
#include <math.h>
int main()
{
float f = 21141235;
printf("%f\n", f);
if(fmodf(f,5.0) == 0)
printf("multiplo di 5\n");
printf("%f\n", fmodf(f,5.0));
return 0;
}
|
|
|
|
|
|
#10 |
|
Member
Iscritto dal: Jun 2007
Messaggi: 62
|
Quindi per vedere se un reale è divisibile per 5 devo fare per forza l'fmod? visto che nei reali ci sono anche gli interi nel caso avessi letto per dire 25 il comando %5 sarebbe stato lecito oppure no? Mi sa di no eh.. :-(
|
|
|
|
|
|
#11 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Avresti dovuto fare:
if((int)f % 5 == 0) ma in ogni caso se avessi letto 25.1111 ti avrebbe dato comunque 0... |
|
|
|
|
|
#12 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Se ragioniamo su questi casi al limite della precisione, il problema indubbiamente c'è, sono d'accordo.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
|
#13 | |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Quote:
Basta trovarsi per la strada un numero reale non rappresentabile... Anzi...con i float la lista di operazioni non deve essere nemmeno tanto lunga, Codice:
#include <stdio.h>
#include <math.h>
int main()
{
float f = 155.0;
f += 662.23;
f -= 662.23;
printf("%f\n", f);
if(fmodf(f,5.0) == 0)
printf("multiplo di 5\n");
printf("%f\n", fmodf(f,5.0));
return 0;
}
|
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 23:32.




















