Ist die Zahl x integer oder double?



  • Hey Leute,

    ich suche nach einer Möglichkeit eine Zahl x zu überprüfen lassen, ob sie eine natürliche zahl (integer) ist. Gibt es dafür eine brauchbare Funktion, oder muss ich dann doch auf die guten alten Token zurückgreifen?

    Mfg Golfi1812



  • Ja man kann es z. B. machen, indem man überprüft, ob beim Aufrunden das gleiche Ergebnis herauskommt wie beim Abrunden. Die Funktionen dafür ceil() und floor() sind in cmath .

    #include <iostream>
    #include <cmath>
    
    using namespace std;
    
    int main(void){
        double n;
        cin >> n;
        if (floor(n) == ceil(n)){
            cout << "Integer" << endl;
        }
        else{
            cout << "kein Integer" << endl;
        }
        return 0;
    }
    


  • Danke, gibt es auch noch weitere Methoden? (postet ruhig weiter)



  • Wie sieht's denn damit aus:

    bool istGanzzahl(double x) {
        return static_cast<int>(x) == x;
    }
    


  • DrHaxxor schrieb:

    Wie sieht's denn damit aus:

    bool istGanzzahl(double x) {
        return static_cast<int>(x) == x;
    }
    

    ⚠ Rechnen mit Fließkommazahlen durch solche Vergleichsoperatoren ist sehr
    gefährlich.

    edit: Vielleicht doch nicht ... im Test klappts



  • Die static_cast<int>-Geschichte wird schiefgehen, wenn x > INT_MAX oder x < INT_MIN ist.

    Ansonsten: Sollen nur eingegebene Zahlen oder auch Ergebnisse von Zwischenrechnungen überprüft werden? Du musst davon ausgehen, dass die Ergebnisse von Rechnungen mit double etwas ungenau sein können; deswegen benutzt man mit Fließkommatypen in der Regel auch epsilon-Vergleiche. Es könnte deshalb Sinn machen,

    bool epsilon_equal(double x, double y, double epsilon = 1e-9) {
      return std::abs(x - y) < epsilon;
    }
    
    bool is_integer(double x, double epsilon = 1e-9) {
      return epsilon_equal(x, std::floor(x + 0.5), epsilon);
    }
    

    oder etwas ähnliches zu schreiben.



  • #include <iostream>
    #include <limits>
    
    int main()
    {
        double n;
    
        if (std::numeric_limits<decltype(n)>::is_integer)
        {
            std::cout << "Integer\n";
        }
        else
        {
            std::cout << "kein Integer\n";
        }
    }
    

  • Mod

    Hacker schrieb:

    ⚠ Rechnen mit Fließkommazahlen durch solche Vergleichsoperatoren ist sehr
    gefährlich.

    edit: Vielleicht doch nicht ... im Test klappts

    Was auch kein Wunder ist, denn es ist hier nicht gefährlich. Verstehe wovon du sprichst, bevor du solche Warnungen gibst.



  • Golfi1812 schrieb:

    ich suche nach einer Möglichkeit eine Zahl x zu überprüfen lassen, ob sie eine natürliche zahl (integer) ist. Gibt es dafür eine brauchbare Funktion, oder muss ich dann doch auf die guten alten Token zurückgreifen?

    Kommt drauf an, in welchem Format die zahl vorliegt. Wenn x ein int ist -> klarer Fall. Bei double gibts die verschiedenen genannten Methoden. Wenn die Zahl nur als Zeichenfolge vorliegt, gehts vielleicht noch einfacher (suche nach dem Komma und den nachkommastellen)



  • Danke....Habe jetzt meine kleine Anwendung fertig.

    Sie überprüft,ob die eingegebene Zahl eine Primzahl ist.
    Jetzt wird das alles noch schöner gemacht, Buttons usw..

    Hier ist der Quellcode:

    #include "../../../std_lib_facilities.h" 
    #include "conio.h"
    
    bool test(double n){ 
        if (floor(n) == ceil(n)){ 
            return false; 
        } 
        else{ 
            return true; 
        } 
    
    }
    
    int main()
    {
    	bool i;
    	double n;
    
    	double r;
    	int x = 0;
    
    	double t = 1;
    
    	cout<<"Die zutestende Zahl:";
    	cin>>n;
    	cout<<"\n";
    
    	while(t<=n)
    	{
         r = n/t;
    	 i = test(r);
    
    	 if(i==0)
    	 {
    		 ++x;
    	 }
    
    	 ++t;
    	}
    
    	if(x==2)
    	{
    		cout<<n<<" ist eine Primzahl!";
    
    	}
    	else
    	{
    		cout<<n<<" ist keine Primzahl!";
    	}
    	getch();
    }
    

    Was haltet ihr davon? Es gibt sicherlich auch noch andere Wege, welcher gefällt euch am besten?

    Mfg Golfi1812



  • Das geht sicher einfacher, wenn du mit ganzen Zahlen arbeitest (Teilbarkeit kannst du per Modulo-Operator feststellen). (außerdem: Wenn du bereits einen Faktor gefunden hast, brauchst du nicht weiterzusuchen ;))



  • 1. warum ließt du nicht gleich einen Integer ein?
    2.

    bool isPream(int number){
        for(int t = 2; t < number; ++t){
            if(n%t == 0){
                return false;
            }
        }
        return true;
    }
    


  • #include <iostream>
    
    bool is_prime(unsigned n)
    {
        if (n == 2 || n == 3)
            return true;
    
        if(n < 5)
            return false;
    
        for(unsigned i = 5, delta = 2; i * i <= n; i += delta, delta = 6 - delta)
            if(!(n % i))
                return false;
    
        return true;
    }
    
    int main()
    {
        int mightbeprime;
        std::cin >> mightbeprime;
    
        if(!std::cin)
        {
            std::cout << "Ungueltige Eingabe!\n";
            return 1;
        }
    
        std::cout << mightbeprime << " ist " << is_prime(mightbeprime) + "keine Primzahl!\n";
        return 0;
    }
    


  • @314159265358979
    Hast du deinen Code mal getestet?



  • Nö. Wenns nicht funktioniert, gut so.



  • Bei deinem Code scheint nämlich jede Zahl eine Primzahl zu sein. 😃



  • 314159265358979 schrieb:

    Nö. Wenns nicht funktioniert, gut so.

    Genau.
    Ganz nach deinem Motte: Hauptsache mal wieder Scheisse gepostet.



  • Nö, nach dem Motto: Keine Komplettlösungen. 😉
    Motten sind übrigens cool.



  • #include <iostream>
    #include <string>
    
    using namespace std;
    
    inline bool is_prime(const unsigned n)
    {
    	for(unsigned a=2;a<n;a++)
    		if(!(n%a))
    			return false;
    	return true;
    }
    
    int main(void)
    {
    	cout<<"Bitte Zahl eingeben: ";
    	unsigned a;
            cin>>a;
    
    	string res=(is_prime(a))?"Diese Zahl ist eine Primzahl!":
                                     "Nein, diese Zahl ist keine Primzahl.";
    	cout<<res<<endl;
    }
    

    So korrekt 😞 ?



  • Hacker schrieb:

    ...

    Wie wärs mit ohne String?

    int main(void)
    {
    	cout<<"Bitte Zahl eingeben: ";
    	unsigned a;
    	cin>>a;
    
    	cout << "Die Zahl ist " << is_prime(a)?"":"k" << "eine Primzahl." <<endl;
    }
    


  • Wie wärs mit ohne ?: ?


Anmelden zum Antworten