Betrag einer Zahl??



  • Hallo Leute,

    Brauche eine Methode umd den Betrag einer Zahl du bekommen?



  • Nimm abs für Integer und fabs für Fließkommazahlen.

    Schau doch bitte in der Hilfe nach bevor du mit sowas hier ankommst...



  • Eigentlich kann man std::abs für alle Zahlen verwenden.



  • betrag is doch, dass es die gleiche zahl ist, aber positiv!!
    dann würd ichs so machen:

    int function (int zahl) {
    int neuezahl;
    if(zahl < 0)
     neuezahl = zahl - zahl - zahl;
    else
     neuezahl = zahl;
    return neuezahl;
    //wenn zahl z.b. -5 ist, kommmt als rechnung das hier  neuezahl = -5 -  (-5)-(-5)
    // was gleich ist wie -5 + 5 + 5 und somit der betrag +5 ergäbe. (wenns falsch ist, 
    // dann sagts =)
    
    }
    


  • mollitz schrieb:

    if(zahl < 0)
    neuezahl = zahl - zahl - zahl;

    Das kann man noch zu zahl + zahl + zahl - zahl - zahl - zahl - zahl optimieren.



  • int n1 = -5;
    int n2 = 0;
    
    n2 = -n1;
    
    cout << n2 << endl;
    

    🙂



  • template<typename T>
    inline T myAbs(T value)
    {
        return value < 0 ? -value : value;
    }
    


  • David_pb schrieb:

    Schau doch bitte in der Hilfe nach bevor du mit sowas hier ankommst...

    Naja, manchmal fehlen einfach die Suchbegriffe um etwas zu finden.
    Zudem erweitert die hochoptimierte Version von Bashar den Horizont und hat uns doch so allen was gebracht =o)



  • Soso:

    Für 32 Bit Fließkommazahlen:

    float FAbs( float val )
    {
    	unsigned long tmp = *reinterpret_cast< unsigned long *>( &val );
    	tmp &= 0x7fffffff;
    	return *reinterpret_cast< float *>( &tmp );
    }
    

    Und für Integer:

    int Abs( int val )
    {
    	int y = val >> 31;
    	return ( ( val ^ y ) - y );
    }
    

    Oder die M$ spezifischen Versionen unter Verwendung der FPU:

    float FAbs( float val )
    {
    	__asm
    	{
    		fld		val
    		fabs
    	}
    }
    
    int Abs( int val )
    {
    	int i;
    
    	__asm
    	{
    		fild		val
    		fabs
    		fistp		i
    	}
    
    	return i;
    }
    

    😉



  • Also ich würde ja die templatebasierte Version vorziehen, denn wir sind ja in C++ und wollen nicht tausend abs Namen haben ;o)

    template <typename T>
    T Abs( T val ) 
    { 
    	return value < 0 ? -value : value;
    } 
    
    template <>
    int Abs( int val ) 
    { 
    
    	int y = val >> 31; 
    	return ( ( val ^ y ) - y ); 
    } 
    
    template <>
    float Abs( float val ) 
    { 
    	unsigned long tmp = *reinterpret_cast< unsigned long *>( &val ); 
    	tmp &= 0x7fffffff; 
    	return *reinterpret_cast< float *>( &tmp ); 
    } 
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    	char a = -12;
    	int  b = -12;
    	float c = -12;
    
    		a = Abs(a);
    		b = Abs(b);
    			c = Abs(c);
    	return 0;
    }
    

    Aber eigentlich wollte ich nur sagen, das ich als Antwort auf die erste Frage als Ideal empfunden hätte:

    "Schau Dir mal abs , fabs bzw. std::abs in der Hilfe an" , es fehlt oft wirklich nur an der Begrifflichkeit 😉

    (Und Sinnlos war der Beitrag hier jetzt auch nicht, ich konnte so das Wissen von spazialisierung noch mal auffrischen 😃 )



  • jaja! ich wollts ja bloss veranschaulichen ^^


Log in to reply