Prüfen ob Zahl ein Integer ist?
-
Hallo,
Wie kann ich prüfen ob eine Zahl ein Integer ist?
Die Suche Funktioniert leider nicht und in der FAQ wurde ich auch nicht fündig! (Ja, bei der MSDN habe ich auch schon gessucht (mit der Suche))
-
Ich nehm mal an, du willst testen, ob eine Fließkommazahl eine ganze Zahl darstellt? Wenn dem so ist, würde ich es so versuchen:
float a; //a wird ein Wert zugewiesen if((static_cast<signed long int>(a)-a)<FLT_EPSILON) Anweisung;
oder so ähnlich. Also erstmal in einen Integer umwandeln und sehen wie groß die Abweichung ist.
FLT_EPSILON ist übrigens ein Makro, dass für die kleinste Abweichung steht, die Float mitbekommt, wenn eine 1 vor dem Komma steht.(Kann das bitte jemand besser erklären?)
Das entsprechende Makro für double ist DBL_EPSILON und für long double LDBL_EPSILON. Nachzuschlagen in "float.h".Oder was schlagen die anderen vor?
Probiers auf alle Fälle mal aus.
edit.
-
Oder so:
float f = 222.2; if(f == (int)f) { //Keine Nachkommastellen also Integer } else { //Mit Nachkommastellen also kein Integer }
-
Meine erste Idee funktioniert wahrscheinlich nicht. Sobald die zu prüfende Zahl zu groß wird, wird auch die Rechenungenauigkeit zu groß. Versuchs mit der Idee von Max M. Oder:
if((f - (int)(f+0.5))< (FLT_EPSILON*f)) //Keine Nachkommastellen!
Auf Gleicheit Prüfen bei Fließkommazahlen geht gerne schief. "f+0.5" sorgt dafür, dass (int) ordentlich rundet, und nicht 4.9999999 auf 4 Abschneidet, so wird es zu 5,4999999, wass dann ordentlich auf 5 abgeschnitten wird. Sollte dein Compiler (int) von sich aus runden lassen, musst du +0.5 natürlich weglassen.
Das (FLT_EPSILON*f) deswegen, weil sonst bei größeren Zahlen(eventuell sogar schon bei 10) die Rechenungenauigkeit größer wird als die erlaubt Abweichung. Man muss natürlich immer das richtige Makro hinsetzen. Wenn du also float benutzt FLT_EPSILON, bei double DBL_EPSILON und bei long double LDBL_EPSILON.
Sag mir dann mal ob's klappt.
-
Hallo,
Eigentlich will ich nur Prüfen ob der User eine Zahl eingegeben hat und keinen Buchstaben etc
-
Max M. schrieb:
float f = 222.2; if(f == (int)f) { //Keine Nachkommastellen also Integer } else { //Mit Nachkommastellen also kein Integer }
Das dürfte aber Probleme geben, wenn f nicht mehr in einen int passt...
-
wäre wohl nicht schlecht, wenn du die Frage demnächst etwas genauer formulieren würdest
int i; cin>>i; if( cin.fail() ){ cerr<<"format error"<<endl; }
1st edit: post scriptum: wenn du prüfen möchtest, ob ein einzelnes Zeichen eine Zahl ist, dann versuche es doch mal mit der guten alten Funktion isdigit
-
Ich hab mir so eine Funktion selber geschrieben, die Wandelt einen String in einen unsigned long und gibt 0 zurück wenn auch nur ein falsches Zeichen auftaucht:
unsigned long int StrToDWord(char *s) { unsigned short int l=strlen(s); if(l>9) return 0; //Damit die Zahl nicht zu groß werden kann unsigned long int Antwort=0; unsigned short int i=l; while(i--) //Von Hinten anfangen, geht aber auch von vorn... { if(s[i]<'0' || s[i]>'9') //Falls keine Zahl vorliegt, wird 0 zurückgeliefert { return 0; } Antwort += static_cast<unsigned long int>(pow(10.0,l-i-1))*(static_cast<unsigned long int>(s[i]) - static_cast<unsigned long int>('0')); } //ermitteln der Zehnerpotenz //ermitteln des Wertes //Damit '0' auch 0 ist return Antwort; //Da '0' in der ASCII-Tabelle nicht immer durch 48 representiert wird } //sondern auch durch andere Werte, dadurch ist das Programm portabler!
Kannst es dir ja mal anschauen
-
Nimda schrieb:
Ich hab mir so eine Funktion selber geschrieben...
sind verbesserungen erwünscht?
-
...und wie sie mit den Hufen scharren
-
Verbesserungen an meiner Funktion? nö. War nur zum üben. Irgendwann mach ich die mal weiter/besser/fertig.
-
volkard schrieb:
sind verbesserungen erwünscht?
bitte nicht l als variablennamen verwenden.
-
davie schrieb:
bitte nicht l als variablennamen verwenden.
nö<=nein<=NEIN<=/*ZENSIERT von mir selbst
*/
noch bin ich erst bei "nein".
Ich weis, dass man das nicht macht. Aber die Funktion war nur für mich bestimmt. Ich benutze so kurze Bezeichner auch nur nach 22 Uhr. Ich bin dann schon zu müde, wir schönere Namen auszudenken.
-
<-Nimda before
Nimda.calm
<-Nimda after
-
freshman schrieb:
<-Nimda before
Nimda.calm
<-Nimda after
du hast bei "calm" () vergessen!
-
da kommt ja auch gar keine hin; das ist nämlich human++
++ ==
1st edit: @Nimda: hast schon recht
-
Nimda schrieb:
Meine erste Idee funktioniert wahrscheinlich nicht. Sobald die zu prüfende Zahl zu groß wird, wird auch die Rechenungenauigkeit zu groß. Versuchs mit der Idee von Max M. Oder:
if((f - (int)(f+0.5))< (FLT_EPSILON*f)) //Keine Nachkommastellen!
Auf Gleicheit Prüfen bei Fließkommazahlen geht gerne schief. "f+0.5" sorgt dafür, dass (int) ordentlich rundet, und nicht 4.9999999 auf 4 Abschneidet, so wird es zu 5,4999999, wass dann ordentlich auf 5 abgeschnitten wird. Sollte dein Compiler (int) von sich aus runden lassen, musst du +0.5 natürlich weglassen.
Das (FLT_EPSILON*f) deswegen, weil sonst bei größeren Zahlen(eventuell sogar schon bei 10) die Rechenungenauigkeit größer wird als die erlaubt Abweichung. Man muss natürlich immer das richtige Makro hinsetzen. Wenn du also float benutzt FLT_EPSILON, bei double DBL_EPSILON und bei long double LDBL_EPSILON.
Sag mir dann mal ob's klappt.Funktioniert auch nicht so wärs richtig:
if(fabs((f - (int)(f+0.5)))< (FLT_EPSILON*f)) //Keine Nachkommastellen!
mfg Erwin
-
Erwin schrieb:
if(fabs((f - (int)(f+0.5)))< (FLT_EPSILON*f)) //Keine Nachkommastellen!
warum so kompliziert?
if (ceil(x) == floor(x)) printf ("ganze zahl"); else printf ("bruch");
edit: geht ja noch einfacher
if (x == floor(x)) printf ("ganze zahl"); else printf ("bruch");
-
net schrieb:
Erwin schrieb:
if(fabs((f - (int)(f+0.5)))< (FLT_EPSILON*f)) //Keine Nachkommastellen!
warum so kompliziert?
if (ceil(x) == floor(x)) printf ("ganze zahl"); else printf ("bruch");
edit: geht ja noch einfacher
if (x == floor(x)) printf ("ganze zahl"); else printf ("bruch");
Denkste, dass geht auch nicht immer gut da wie gesagt float-Operationen nicht ganz genau sind. Wenn ich z.b.: 9/3 dividiere ergibt das nicht 3 als float sondern 2.99999...... und floor(2.9999) ist bekanntlich 2
[code]
float x = 0.48; //0.48/0.008 = 60
if ((x/0.008) != floor(x/0.008))
{ printf("Keine ganze Zahl ????");}
[cpp]
Probiers aus!
-
ewitt7u0 schrieb:
Denkste, dass geht auch nicht immer gut da wie gesagt float-Operationen nicht ganz genau sind. Wenn ich z.b.: 9/3 dividiere ergibt das nicht 3 als float sondern 2.99999......
das problem haste immer. fliesskommazahlen sind einfach mist.