Wenn ich hier auf den "Rückgabewert" schaue, kommen mir Zweifel, ob ich das
richtig verstehe.
Kann mir bitte jemand erklären, ob das was dort steht richtig oder falsch ist.
Meiner Meinung nach muss 'abs(-5)' '5' liefern...
Viele Grüße Thomas
funktionieren tut es mit dem Bsp. Code richtig.
Die Beschreibung ist nur seltsam bzw. falsch.
Im Rückgabewert können keine 2 Operatoren sein. Zudem ein Absolutwert immer positiv ist ohne jede weitere Berechnung. Genau das macht auch hier die abs() Funktion. Für mich ist die Beschreibung falsch. Zudem in der Beschreibung der Funktion auch die Angabe der Datentypen für Parameter und Rückgabetyp fehlt.
Ich finde die Erklährung zutreffend:
Returns
x: if x is greater than or equal to 0.
-x: if x is less than 0.
Wenn die Zahl positiv ist kommt sie so zurück.
Wenn sie negativ ist (positive Zahl mit negativem Vorzeichen) , kommt sie negativ zurück; also: -(-(positive Zahl) also mit -1 multipliziert und darum positiv.
Der wikipedia-Artikel enthält übrigens den Text aus der Arduino Referenz
Dass ein digitalComputer keine reellen Zahlen kennt ist nicht so relevant, was der Datentyp des Ergebnis int i = -3; auto ia = abs(i);
ist, wäre schon interessant
Das was dort steht ist natürlich richtig, nur man muss es interpretieren!!!
Dort steht: die Funktion: Betrag von X ist definiert für X<0 und X>= 0.
Reelle Zahlen also! Im Zweifel schau dir doch nochmal den roten
Funktionsverlauf an, meiner Meinung nach kann man die nicht falsch
verstehen. Setze ein:
x=1 liefert y=1, x=2 liefert Y=2
x=-1 liefert (+) 1!!!
x=-2 liefert (+) 2!!!
Kritisch könnte höchstens die Null sein. Aber wie du richtig gesehen hast,
steht in der Definition, das für 0 ein positives Vorzeichen gilt.
VG Thomas
Natürlich ist es richtig, wenn in der Doku -x als Rückgabewert für x < 0 steht.
So wie ich hier -value verwende.
Vielleicht verwirrend, aber durchaus korrekt
Danke @combie für den Link, das aber leider nicht beschreibt, was mich interessiert.
Experimentell finde ich z.B. mit einem wokwi-uno
void setup() {
Serial.begin(115200);
auto ia = abs(-7);
auto la = abs(-1000000);
auto fa = abs(-6.99999);
Serial.print (sizeof(ia)); Serial.print(": "); Serial.println(ia,10); // int: DEC
Serial.print (sizeof(la)); Serial.print(": "); Serial.println(la,10); // long: DEC
Serial.println(fa,10); // float/double: digits
}
Mit dem Ergebnis
2: 7
4: 1000000
6.9999899864
also mehrere überladene ( wie println ) oder eine template - Funktion
bei einer äußerlichen Funktionsbeschreibung interessiert mich nicht was die Funktion intern rechnet, mich interessiert was der Rückgabewert ist. Korrekterweise sollte stehen |x| als Rückgabewert, also in allen Fällen Betrag von x. Die aktuelle Beschreibung suggeriert das ich 1:1 -x als Rückgabewert bekomme genauso wie ich ihn übergebe. Laut eurer Erklärung müsste stehen -1 * -x. Steht aber nicht da. An einer Rückgabewertangabe -x kann man nicht erkennen das -x * -1 gemeint ist. Das geht einfach nicht. Das ist mathematisch nicht erklärbar.
ich versuche mich logisch reinzudenken, ich weiß auch, denke ich, was du meinst. Nur mathematisch passt das für mich nicht zusammen. Die Nebenbedingung für x * -1 ist, wenn x negativ ist. Am Ende wird gerechnet -x * -1, sonst wird das Ergebnis nicht positiv. Vielleicht schwierig zu erklären.
Ich habe keine ähnliche Funktion in der Referenz zur Hand. Ob die Quadratwurzel (sqrt) passt weiß ich nicht. Aber hier steht als Rückgabewert "The number’s square root." Wer wissen will was die Quadratwurzel ist muss sich anderweitig schlau machen. Genauso sehe ich das aktuell beim Absolutwert. Das Ergebnis ist der Betrag. Der Betrag ist in der Mathematik eindeutig was das ist.
Aber gut, vielleicht führt das zu einer Endlosdiskussion. Mir fehlt nur die Logik für die aktuelle Beschreibung.
Ist ja auch nicht gemeint.
( x ) * -1 und -x ist eher dasselbe, stimmts?
Die Feinheiten der Computer-Arithmetik, dass z.B. ein int8_t ein int wird, wenn man es mit -1 multipliziert, oder dass hier bei #define der Ausdruck (x) mehrfach berechnet wird, sind die echten Fallen