Prüfen ob Zahl ein Integer ist?
-
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.