MathUnaryFunction saturates large doubles to Long.MAX_VALUE when collapsing to long (original) (raw)

Affected version: 26.4.2 (confirmed still present in 26.5.1)
Component: com.arcadedb.function.math.MathUnaryFunction / MathBinaryFunction

Summary

For large doubles where result == Math.floor(result) (every value above
2^52), (long) result saturates to Long.MAX_VALUE / Long.MIN_VALUE.
math.floor(1e30) returns 9223372036854775807L.

Code

engine/com/arcadedb/function/math/MathUnaryFunction.java:51–54
(same pattern in MathBinaryFunction.java:47)

final double result = op.applyAsDouble(((Number) args[0]).doubleValue()); if (result == Math.floor(result) && !Double.isInfinite(result)) return (long) result; return result;

Suggested fix

if (result >= Long.MIN_VALUE && result <= Long.MAX_VALUE && result == Math.floor(result)) return (long) result; return result;