Abfrage natürliche Zahl?



  • Am genauesten gehts mit std::string und std::stringstream (<string> und <sstream>).



  • Warum dies?



  • wieso machst du nicht gleich von anfang an unsigned int ?

    ach ja die 0 ist eine komische Zahl im system denn sie ist keine zahl da sie weder multiplizierbar noch dividierbar ist. Aber von der addition und subtraktion her wäre die null eine Zahl. also könne man die 0 mit 1 gleichsetzen während 1 2 ist uswusf...



  • groovemaster schrieb:

    Warum dies?

    Siehe Sig 😉

    Ne, da war ein ganz kurzer Gedankengang, dass die real eingegebene Zahl sich weniger von der entsprechenden int-Zahl unterscheidet als der Ungenauigkeitsfaktor, der verwendet wird.



  • xBlackKnightx schrieb:

    wieso machst du nicht gleich von anfang an unsigned int ?

    ach ja die 0 ist eine komische Zahl im system denn sie ist keine zahl da sie weder multiplizierbar

    Geht.
    [/quote]noch dividierbar ist.[/quote]
    Geht auch.



  • Michael E. schrieb:

    Ne, da war ein ganz kurzer Gedankengang, dass die real eingegebene Zahl sich weniger von der entsprechenden int-Zahl unterscheidet als der Ungenauigkeitsfaktor, der verwendet wird.

    Achso, du meinst, dass zB jemand "99.99999999" eingibt und aufgrund der begrenzten Genauigkeit daraus ein double(100.0) wird? Naja, mit solchen Sachen muss man halt leben. Zudem kann der double Wert ja auch aus einer völlig anderen Quelle stammen, zB irgendeiner Berechnung.



  • 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,31640625

    Es 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ürlich

    if (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 wo

    x%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

    http://de.wikipedia.org/wiki/Nat%C3%BCrliche_Zahlen



  • 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 wo

    x%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?


Anmelden zum Antworten