webentwicklung-frage-antwort-db.com.de

Absolutwert einer Zahl ohne Verwendung von Math.abs () ermitteln

Gibt es eine Möglichkeit, den absoluten Wert einer Zahl zu ermitteln, ohne die Math.abs () - Methode in Java zu verwenden.

16
Theja

Wenn Sie in Math.abs nachschauen, finden Sie wahrscheinlich die beste Antwort: 

ZB für Schwimmer:

    /*
     * Returns the absolute value of a {@code float} value.
     * If the argument is not negative, the argument is returned.
     * If the argument is negative, the negation of the argument is returned.
     * Special cases:
     * <ul><li>If the argument is positive zero or negative zero, the
     * result is positive zero.
     * <li>If the argument is infinite, the result is positive infinity.
     * <li>If the argument is NaN, the result is NaN.</ul>
     * In other words, the result is the same as the value of the expression:
     * <p>{@code Float.intBitsToFloat(0x7fffffff & Float.floatToIntBits(a))}
     *
     * @param   a   the argument whose absolute value is to be determined
     * @return  the absolute value of the argument.
     */
    public static float abs(float a) {
        return (a <= 0.0F) ? 0.0F - a : a;
    }
53
mihaisimi

Ja:

abs_number = (number < 0) ? -number : number;

Bei Ganzzahlen funktioniert dies gut (mit Ausnahme von Integer.MIN_VALUE, dessen absoluter Wert nicht als int dargestellt werden kann).

Bei Fließkommazahlen sind die Dinge subtiler. Zum Beispiel wird diese Methode - und alle anderen bisher veröffentlichten Methoden - die negative Null nicht korrekt verarbeiten.

Um nicht mit solchen Feinheiten umgehen zu müssen, würde ich empfehlen, sich an Math.abs() zu halten.

19
NPE

So was:

if (number < 0) {
    number *= -1;
}
13
tibtof

Da Java eine statisch typisierte Sprache ist, würde ich erwarten, dass eine abs-Methode, die ein int annimmt, ein int zurückgibt, wenn erwartet wird, dass float einen float zurückgibt, für ein Double ein Double. Vielleicht könnte es immer den Boxed- oder Unboxed-Typ für Doubles und Doubles usw. geben. 

Sie benötigen also eine Methode pro Typ, aber jetzt haben Sie ein neues Problem: Für Byte, Short, Int, Long ist der Bereich für negative Werte um 1 größer als für positive Werte. 

Was sollte also für die Methode zurückgegeben werden? 

byte abs (byte in) {
   // @todo
}

Wenn der Benutzer abs auf -128 anruft? Sie können immer den nächstgrößeren Typ zurückgeben, damit der Bereich garantiert zu allen möglichen Eingabewerten passt. Dies führt zu Problemen, bei denen kein normaler, größerer Typ existiert, und der Benutzer muss den Wert nach dem Testen immer herabsetzen - möglicherweise ein Ärger. 

Die zweite Möglichkeit ist das Auslösen einer arithmetischen Ausnahme. Dies verhindert das Casting und die Überprüfung des Rückgabetyps für Situationen, in denen bekannt ist, dass die Eingabe begrenzt ist, sodass X.MIN_VALUE nicht auftreten kann. Denken Sie an MONAT, dargestellt als int. 

byte abs (byte in) throws ArithmeticException {
   if (in == Byte.MIN_VALUE) throw new ArithmeticException ("abs called on Byte.MIN_VALUE"); 
   return (in < 0) ? (byte) -in : in; 
}

Das "Lass uns die seltenen Fälle von MIN_VALUE ignorieren" ist eine Option. Zuerst den Code zum Laufen bringen - dann schnell. Wenn der Benutzer eine schnellere, aber fehlerhaftere Lösung benötigt, sollte er diese selbst schreiben. Die einfachste Lösung, die möglicherweise funktioniert, bedeutet: einfach, aber nicht zu einfach.

Da der Code nicht vom Zustand abhängt, kann und sollte die Methode statisch gemacht werden. Dies ermöglicht einen schnellen Test: 

public static void main (String args []) {
    System.out.println (abs(new Byte ( "7")));
    System.out.println (abs(new Byte ("-7")));
    System.out.println (abs((byte)  7));
    System.out.println (abs((byte) -7));
    System.out.println (abs(new Byte ( "127")));
    try
    {
        System.out.println (abs(new Byte ("-128")));
    }
    catch (ArithmeticException ae)
    {
        System.out.println ("Integer: " + Math.abs (new Integer ("-128")));
    }
    System.out.println (abs((byte)  127));
    System.out.println (abs((byte) -128));
}

Ich fange die erste Ausnahme und lasse sie zur Demonstration laufen.

Es gibt eine schlechte Angewohnheit beim Programmieren, was bedeutet, dass Programmierer viel mehr Wert auf schnellen als auf korrekten Code legen. Was für eine Schande!


Wenn Sie neugierig sind, warum es einen negativeren als einen positiven Wert gibt, habe ich ein Diagramm für Sie .

5
user unknown

Verwenden Sie die Klasse Math

Math.abs(num);
2
Victor Urrutia

Dies sollte zwar kein Flaschenhals sein, da Verzweigungsprobleme auf modernen Prozessoren normalerweise kein Problem sind, aber im Fall von ganzen Zahlen können Sie sich für eine branchlose Lösung entscheiden, wie hier beschrieben: http: //graphics.stanford .edu/~ seander/bithacks.html # IntegerAbs .

(x + (x >> 31)) ^ (x >> 31);

Im offensichtlichen Fall von Integer.MIN_VALUE schlägt dies jedoch fehl, daher ist dies eine Verwendung auf eigene Gefahr.

2
Joe C

-num ist gleich num für Integer.MIN_VALUE as

 Integer.MIN_VALUE =  Integer.MIN_VALUE * -1
0
ouertani

Sie können verwenden:

abs_num = (num < 0) ? -num : num;
0
CP Soni

Wenn der Absolutwert einer Ganzzahl x ohne Math.abs (), Bedingungen oder bitweise Operationen ist, könnte eine Lösung in Java unten stehen. 

(int)(((long)x*x - 1)%(double)x + 1);

Da a%b von Java als a - a/b * b behandelt wird, ist das Vorzeichen des Ergebnisses dasselbe wie "a", egal welches Zeichen von "b" ist. (x*x-1)%x wird gleich abs(x)-1 sein; Typ Casting von "long" soll Überlauf verhindern und double erlaubt das Teilen durch Null.

x = Integer.MIN_VALUE verursacht wieder einen Überlauf aufgrund der Subtraktion von 1.

0
Young

Hier ist eine einzeilige Lösung, die den absoluten Wert einer Zahl zurückgibt:

abs_number = (num < 0) ? -num : num;
0
chaitu