Funktion ignoriert anweisung



  • Hallo,

    Bin grad' am verzweifeln.

    Hab für eine Stelle in einem Programm eine Funktion geschrieben, die die Nachkommastellen einer Fließkommazahl ausgeben soll.

    inline us ccounter(long double a){
    
    	us i=0;
    	for(long double j=1;;j/=10){
    
    		while(a>j)a-=j;
    		if(a==j)
    		return i;
    		else
    		++i;
    		cout<<a<<"   "<<j<<"    "<<i<<endl;
    	}
    }
    

    Sie geht aber ins unendliche,
    und ignoriert die anweisung in Zeile 7 anscheinend vollkommen -
    die Schleife wird nicht beendet.

    Was ist da Falsch ?
    Danke im Voraus 😕



  • ups,

    us steht für den Datentyp short.



  • Ich kann mir beim besten Willen nicht vorstellen dass das funktioniert.

    Was genau willst du denn machen?



  • Die Nachkommastellen einer Fließkommazahl berechnen ?!



  • Kannst du nicht einfach den Vorkammaanteil "wegrechnen" und dann ganz normal ausgeben?

    Oder in einen String ausgeben und den Vorkommaanteil aus dem string entfernen?

    Edit:
    In zeile 7 vergleichst du 2 fließpunktzahlen mit ==, was fast nie eine gute idee ist, da es dabei immer ungenauigkeiten gibt.



  • if ( long double == long double )
    wird nur selten als und mit viel glück als true ausgewertet. warum? schau dir mal die fließkommaarithmetik an

    mach lieber eine bereichsprüfung

    if ( abs(long double - long double) <= 0.00..001 )

    das wird schon eher sein, was du willst



  • cranky77 schrieb:

    Die Nachkommastellen einer Fließkommazahl berechnen ?!

    Das macht keinen Sinn.
    Schau dir mal an wie float und double in einem Computer gespeichert werden. Das sind nur Naeherungswerte, da es sehr schwer ist einen unendlich grossen Wertebereich mit endlichen Bits zu speichern.



  • Oh Sorry!!

    Ich meinte, ich will die ANZAHL der Nachkommastellen einer Fließkommazahl berechnen.
    Tut mir leid!



  • @Skym0sh0:

    Ginge auch

    if(long double - long double == 0)



  • cranky77 schrieb:

    if(long double - long double == 0)

    Nein. Da 0 wieder als ein long double interpretiert wird, haben wir die selbe Situation nochmals.



  • Ahh verdammt

    ok ich versuch die 'abs' funktion

    Danke


Log in to reply