Bytecode
Type | Description |
u1 | dcmpl opcode = 0x97 (151) |
u1 | dcmpg opcode = 0x98 (152) |
Stack ..., value1.word1, value1.word2, value2.word1, value2.word1=> ..., result
Description
Both value1 and value2 must be of type double
. The values
are popped from the operand stack, and a floating-point comparison is performed. If value1
is greater than value2, the int
value 1 is pushed onto the
operand stack. If value1 is equal to value2, the int
value 0
is pushed onto the operand stack. If value1 is less than value2, the int
value -1 is pushed onto the operand stack. If either value1 or value2
is NaN, the dcmpg instruction pushes the int
value 1 onto the
operand stack and the dcmpl instruction pushes the int
value -1
onto the operand stack.
Floating-point comparison is performed in accordance with IEEE 754. All values other than NaN are ordered, with negative infinity less than all finite values and positive infinity greater than all finite values. Positive zero and negative zero are considered equal.
Example
dload_1 ; push the double in local variable 1 dconst_0 ; push the double 0.0 onto the stack dcmpg ; compare the two numbers ; The integer result on the stack is: ; 0 if local variable 1 equals 0 ; -1 if local variable 1 is less than 0 ; 1 if local variable 1 is greater than 0
Notes
The dcmpg and dcmpl instructions differ only in their
treatment of a comparison involving NaN. NaN is unordered, so any double
comparison fails if either or both of its operands are NaN. With both dcmpg and dcmpl
available, any double
comparison may be compiled to push the same result
onto the operand stack whether the comparison fails on non-NaN values or fails because it
encountered a NaN.