IEEERemainder: Unterschied zwischen den Versionen

Aus JACK Wiki
Zur Navigation springen Zur Suche springen
Keine Bearbeitungszusammenfassung
K (LaTeX ergänzt)
 
(27 dazwischenliegende Versionen von 7 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
===Zugehörige Evaluatoren===
*'''MathEvaluator'''
=== Beschreibung ===
=== Beschreibung ===
Die Funktion ''iEEERemainder'' berechnet die Remainder-Operation zweier Argumente, wie es in dem IEEE 745 Standard beschrieben ist (vgl. [https://doi.org/10.1109/IEEESTD.2019.8766229 IEEE 754-2019, S. 31], [https://de.wikipedia.org/wiki/IEEE_754#Arithmetik_und_Quadratwurzel Wikipedia]). Die Funktion erwartet zwei Zahlen und gibt das Ergebnis von
\(f_{1} - (f_{2} \cdot \text{round}(\frac{f_{1}}{f_{2}}))\)


Die Funktion ''IEEEremainder'' berechnet die Remainder-Operation auf zwei Argumente, wie es in dem IEEE 745 Standtard beschrieben ist [https://de.wikipedia.org/wiki/IEEE_754#Aritmetik_und_Quadratwurzel]. Die Funktion erwartet zwei Zahlen und gibt das entsprechende Ergebnis zurück.
zurück.


=== Syntax ===
=== Syntax ===
  IEEEremainder(float f1, float f2)
  iEEERemainder([[Gleitkommazahl]] f1, [[Gleitkommazahl]] f2)


=== Parameter ===
=== Parameter ===
Zeile 11: Zeile 17:


=== Return Value ===
=== Return Value ===
*Gibt den Rest-Wert zurück, wenn f1 durch f2 geteilt wird
* Gibt das gerundete Ergebnis von \(f_{1} - (f_{2} \cdot Q)\) zurück. Q ist dabei das gerundete Ergebnis von \(f_{1}/f_{2}\). '''Hinweis''': Wenn \(f_{1}/f_{2}\) genau zwischen zwei ganzen Zahlen liegt, wird die gerade ganze Zahl zurückgegeben ([https://de.wikipedia.org/wiki/Rundung#Symmetrisches_Runden symmetrisches Runden]).
* Wenn das Ergebnis gleich 0 ist, wird bei positivem \(f_{1}\) <code>+0</code> und bei negativem \(f_{1}\) <code>-0</code> zurückgegeben.
* Wenn \(f_{2}\) gleich 0 ist, wird NaN zurückgegeben.
 
===Unterschied zu Modulo===
Beide geben den Rest nach der Division zurück, verwenden aber unterschiedliche Formeln:
 
iEEERemainder = dividend - (divisor * Math.Round(dividend / divisor))
 
Modulo = (Math.Abs(dividend) - (Math.Abs(divisor) * (Math.Floor(Math.Abs(dividend) / Math.Abs(divisor))))) * Math.Sign(dividend)
 
Beispiel:
 
3/2    iEEERemainder-->returns -1    Modulo-->returns 1
11/3  iEEERemainder-->returns -1    Modulo-->returns 2
28/5  iEEERemainder-->returns -2    Modulo-->returns 3


=== Beispiele ===
=== Beispiele ===
==== Standardfälle ====
==== Standardfälle ====
  IEEEremainder(4,2)  --> returns 0
  iEEERemainder(4,2)  --> returns 0
  IEEEremainder(3,2)  --> returns -1
  iEEERemainder(3,2)  --> returns -1
iEEERemainder(27,4)  --> returns -1
iEEERemainder(17.8,4)  --> returns 1.8


==== Benutzung mit Variablen ====
==== Benutzung mit Variablen ====
  IEEEremainder([pos=1],[pos=2])
  iEEERemainder([var=a],[var=b])
IEEEremainder([var=a],[var=b])
 
==== Benutzung mit studentischen Eingaben ====
====JUnit Tests====
'''Jack2:'''
<span class="mw-customtoggle-myDivision">[Anzeigen]</span>
iEEERemainder([pos=1],[pos=2])
<syntaxhighlight lang="java" class="mw-collapsible mw-collapsed" id="mw-customcollapsible-myDivision">
@Before
public void beforeTest() {
  placeFillInVariable(1, OMParser.parse("0"));
  placeFillInVariable(2, OMParser.parse("20"));
  placeFillInVariable(3, OMParser.parse("-10"));
  placeExerciseVariable("a", OMParser.parse("0"));
  placeExerciseVariable("b", OMParser.parse("20"));
  placeExerciseVariable("c", OMParser.parse("-10"));
}
@Test
public void testIEEERemainder(){
  assertTrue(-1 == getEvaluator().getNumberResult("IEEEremainder(3, 2)"));
  assertTrue(0 == getEvaluator().getNumberResult("IEEEremainder(4, 2)"));
  assertTrue(1 == getEvaluator().getNumberResult("IEEEremainder(10, 3)"));
  assertTrue(-1 == getEvaluator().getNumberResult("IEEEremainder(11, 3)"));
  assertTrue(-1 == getEvaluator().getNumberResult("IEEEremainder(27, 4)"));
  assertTrue(-2 == getEvaluator().getNumberResult("IEEEremainder(28, 5)"));
}
@Test //It returns for Example 1.800000000XXX not 1.8
public void testIEEERemainderWithPointNumberResults(){
  assertTrue(1.8 == getEvaluator().getNumberResult("IEEEremainder(17.8, 4)")); 
  assertTrue(1.4 == getEvaluator().getNumberResult("IEEEremainder(17.8, 4.1)"));
  assertTrue(0.1 == getEvaluator().getNumberResult("IEEEremainder(-16.3, 4.1)"));
  assertTrue(1.4 == getEvaluator().getNumberResult("IEEEremainder(17.8, -4.1)"));
  assertTrue(-1.4 == getEvaluator().getNumberResult("IEEEremainder(-17.8, -4.1)"));
}
@Test
public void testIEEERemainderAtZero(){
  assertTrue("NaN".equals(getEvaluator().getResultAsEvaluatorString("IEEEremainder(5, 0)")));
}
@Test
public void testIEEERemainderWithInput(){
  assertTrue(0 == getEvaluator().getNumberResult("IEEEremainder([pos=1], 4)"));
  assertTrue(0 == getEvaluator().getNumberResult("IEEEremainder([pos=2], [pos=3])"));   
}
@Test
public void testIEEERemainderWithVariables(){
  assertTrue(0 == getEvaluator().getNumberResult("IEEEremainder([var=a], 4)"));
  assertTrue(0 == getEvaluator().getNumberResult("IEEEremainder([var=b], [var=c])"));
}
@Test
public void testIEEERemainderWithExpressions(){
  assertTrue(0 == getEvaluator().getNumberResult("IEEEremainder('15', 'IEEEremainder(10, 3)'"));
  assertTrue(0 == getEvaluator().getNumberResult("IEEEremainder('IEEEremainder(10, 3)', 'IEEEremainder(10, 3)'"));
}
@Test(expected=InvalidEvaluatorFunctionArgumentException.class)
public void testIEEERemainderWithWrongInputCharacter(){
  getEvaluator().getNumberResult("IEEEremainder(17.8, a)");
}
@Test(expected=UnsupportedEvaluatorFunctionException.class)
public void testIEEERemainderWithOneArgument(){
  getEvaluator().getNumberResult("IEEEremainder(8)");
}
@Test(expected=UnsupportedEvaluatorFunctionException.class)
public void testIEEERemainderWithThreeArguments(){
  getEvaluator().getNumberResult("IEEEremainder(3, 2, 8)");
}
@Test(expected=UndefinedExerciseVariableException.class)
public void testIEEERemainderWithMissingExerciseVariable(){
  getEvaluator().getNumberResult("IEEEremainder('[var=j]', '3')");
}
@Test(expected=UndefinedFillInVariableException.class)
public void testIEEERemainderWithMissingInput(){
  getEvaluator().getNumberResult("IEEEremainder('[pos=42]', '3')");
}
</syntaxhighlight>


=== Hinweise ===
'''Jack3:'''
iEEERemainder([input=field1],[input=field2])


[[Kategorie:Evaluatorfunktion]]
[[Kategorie:Math-Evaluatorfunktion]][[Kategorie:JACK3]]

Aktuelle Version vom 20. Mai 2026, 12:11 Uhr

Zugehörige Evaluatoren

  • MathEvaluator

Beschreibung

Die Funktion iEEERemainder berechnet die Remainder-Operation zweier Argumente, wie es in dem IEEE 745 Standard beschrieben ist (vgl. IEEE 754-2019, S. 31, Wikipedia). Die Funktion erwartet zwei Zahlen und gibt das Ergebnis von

\(f_{1} - (f_{2} \cdot \text{round}(\frac{f_{1}}{f_{2}}))\)

zurück.

Syntax

iEEERemainder(Gleitkommazahl f1, Gleitkommazahl f2)

Parameter

  • f1 - Zähler
  • f2 - Nenner

Return Value

  • Gibt das gerundete Ergebnis von \(f_{1} - (f_{2} \cdot Q)\) zurück. Q ist dabei das gerundete Ergebnis von \(f_{1}/f_{2}\). Hinweis: Wenn \(f_{1}/f_{2}\) genau zwischen zwei ganzen Zahlen liegt, wird die gerade ganze Zahl zurückgegeben (symmetrisches Runden).
  • Wenn das Ergebnis gleich 0 ist, wird bei positivem \(f_{1}\) +0 und bei negativem \(f_{1}\) -0 zurückgegeben.
  • Wenn \(f_{2}\) gleich 0 ist, wird NaN zurückgegeben.

Unterschied zu Modulo

Beide geben den Rest nach der Division zurück, verwenden aber unterschiedliche Formeln:

iEEERemainder = dividend - (divisor * Math.Round(dividend / divisor))
Modulo = (Math.Abs(dividend) - (Math.Abs(divisor) * (Math.Floor(Math.Abs(dividend) / Math.Abs(divisor))))) * Math.Sign(dividend)

Beispiel:

3/2    iEEERemainder-->returns -1    Modulo-->returns 1
11/3   iEEERemainder-->returns -1    Modulo-->returns 2
28/5   iEEERemainder-->returns -2    Modulo-->returns 3

Beispiele

Standardfälle

iEEERemainder(4,2)   --> returns 0
iEEERemainder(3,2)   --> returns -1
iEEERemainder(27,4)  --> returns -1
iEEERemainder(17.8,4)  --> returns 1.8

Benutzung mit Variablen

iEEERemainder([var=a],[var=b])

Benutzung mit studentischen Eingaben

Jack2:
iEEERemainder([pos=1],[pos=2])
Jack3:
iEEERemainder([input=field1],[input=field2])