Abfrage natürliche Zahl?
-
Oder dies:
std::string tmp; std::cin>>tmp; if(tmp.find('.')!=std::string:npos){ return false; }else{ return true; }
-
Sicher. Sonst noch irgendwelche unsinnigen Vorschläge?
-
Michael E. schrieb:
Geht.
noch dividierbar ist.
Geht auch.was geht auch?
n * 0 = 0 <-- was hat das für einen Sinn? immer nur Null?
n / 0 = error <-- wozu error? etwas nützliches sollte man rauskratzen!
0 / n = 0 <-- was hat das für einen Sinn?? immer nur Null?
-
Das Problem der Genauigkeit liegt einfach in der Art der darstellung von Floatingpoint Zahlen. So lassen sich die einzelnen Zahlen nur aus der Summe von 2er Potenzen darstellen.
Beispiel: 2^-2 + 2^-4 + 2^-8 = 0,25 + 0,0625 + 0,00390625 = 0,31640625Es sollte leciht verständlich sein, dass es so schnell zu Problemen führen kann, ein schönes Beispiel ist, cih hoffe ich schreib es jetzt richtig auf.
float x=1.0; while (x!=0.0) { std::cerr << "x= " << x << std::endl; x-=0.1; }
Wieder erwarten sollte dieses Beispiel nämlich nciht nach 10 Schritten aufhören, das liegt daran, das sich 0.1 einfach nicht genau genug dartellen lässt. Hoffe 0.1 war die richtige Zahl, einfach mal bissl ausprobieren wen es interessiert. Viele Zahlen funktionieren nicht, andere schon, wie gesagt, Summer von 2er Potenzen.
Soviel zur Genauigkeit
-
Slin schrieb:
Hab gerade ncoh ne andere idee, weiß aber auch nciht ob das sinnvoller ist:
Caste sie einfach zweimal, erst in einen int, dannw eider zurück zu double, wenn es dann ncoh die glecih ist, dann war sie vorher schon natürlichif (x>0 && (double)((int)x)==x)
das sollte es schon tun
if( x%1 != 0 && x>0)
Oder lieg ich jetzt komplett falsch?
-
xBlackKnightx schrieb:
n * 0 = 0 <-- was hat das für einen Sinn? immer nur Null?
n / 0 = error <-- wozu error? etwas nützliches sollte man rauskratzen!
0 / n = 0 <-- was hat das für einen Sinn?? immer nur Null?
1. n / 0 gibt nan, zumindest bei Fließkommazahlen
2. Äh...das macht sogar ziemlich viel Sinn. Also - auf so ziemlich jede andere Art würde es keinen Sinn machen. Du musst dabei bedenken, dass die 0 nicht immer als Konstante im Code auftaucht. Sehr gut denkbar wäre etwas dieser Art:double d; cin >> d; cout << "Fläche eines Kreises mit Radius " << d << ": " << (3.1415926 * d * d) << endl;
Wenn der User 0 eingibt, gibts halt 0 - und das ist ja auch richtig.
-
the_alien schrieb:
if (x>0 && (double)((int)x)==x)
das sollte es schon tun
if( x%1 != 0 && x>0)
Oder lieg ich jetzt komplett falsch?[/quote]
Zum einen wolltest du glaub ich [cpp]if( x%1 == 0 && x>0)[/cpp] schreiben.
Und, ja das hatte ich acuh erst angedacht, aber da der ModuloOperator nur Sinn für Ganzzahlige Werte macht, sollte er in C/C++ auch nur für Integers definiert sein. Also wird an der Stelle wox%1
steht automatischen nen cast nach (int) gemacht, bevor der Modulooperator Anwendung findet, was jedoch dazu führt, dass
x%1 == 0
immer true ergibt. Und das wäre nicht so hilfreich.
-
Slin schrieb:
Natürlich heißt, wenn ich mich recht erinner größe als Null und keine Stellen hinterm Komma oder.
ich glaub' die 0 gehört dazu
-
net schrieb:
Slin schrieb:
Natürlich heißt, wenn ich mich recht erinner größe als Null und keine Stellen hinterm Komma oder.
ich glaub' die 0 gehört dazu
Laut Wikipedia definitionssache
-
Slin schrieb:
Zum einen wolltest du glaub ich [cpp]if( x%1 == 0 && x>0)[/cpp] schreiben.
Und, ja das hatte ich acuh erst angedacht, aber da der ModuloOperator nur Sinn für Ganzzahlige Werte macht, sollte er in C/C++ auch nur für Integers definiert sein. Also wird an der Stelle wox%1
steht automatischen nen cast nach (int) gemacht, bevor der Modulooperator Anwendung findet, was jedoch dazu führt, dass
x%1 == 0
immer true ergibt. Und das wäre nicht so hilfreich.
Ja, wollte ich
Dann ist die Methode mit dem Doppelcast wohl noch die einfachste.
-
groovemaster schrieb:
Sicher. Sonst noch irgendwelche unsinnigen Vorschläge?
Wieso? Ist doch ne Idee. Gebe aber zu, das ich die aufgabe falsch verstanden habe...
Besser?
double wert; if(wert(int)!=wert){ //keine ganzzahl }else{ //ganzzahl }
-
Du meinst wohl eher
if (int(wert) != wert)
-
hm, alles quatsch ^^
#include <cmath> bool IstGanzzahl(double d) { return d == std::floor(d); }
funktioiniert übrigens für den gesamten bereich von double und
nicht nur für -2^31 bis 2^31-1 (so wie beim int cast)das casten von double in int oder einen anderen integertypen ist generell nicht zu empfehlen und würde ich persönlich immer versuchen zu vermeiden.
MfG
DDR-RAM
-
xBlackKnightx schrieb:
n * 0 = 0 <-- was hat das für einen Sinn? immer nur Null?
Was hat eigentlich Multiplizieren mit 1 für nen Sinn? Kommt ja immer nur der andere Faktor raus. Warum ist das dann erlaubt?
n / 0 = error <-- wozu error? etwas nützliches sollte man rauskratzen!
http://www.c-plusplus.net/forum/viewtopic-var-t-is-77147-and-highlight-is-division.html
0 / n = 0 <-- was hat das für einen Sinn?? immer nur Null?
Ja warum denn nicht?