pjfanning opened a new pull request, #1278:
URL: https://github.com/apache/poi/pull/1278

   Follow-up to #1275 (same shape as the subnormal-divisor 
`ArithmeticException` it removed).
   
   These functions converted a double argument with `MathUtil.safeDoubleToInt`, 
which throws `IllegalArgumentException` for values outside the int range. The 
exception escaped `WorkbookEvaluator` instead of becoming an error value.
   
   - **`QUOTIENT(5E9,2)`** threw; Excel returns `2500000000`. The quotient is 
now truncated towards zero as a double (`Math.floor`/`Math.ceil`), and an 
infinite quotient (`QUOTIENT(1E308,1E-10)`) is `#NUM!`.
   - **`FACT(1E10)`** threw; Excel returns `#NUM!`. `MathX.factorial(double)` 
now does the range check itself: `>= 171` is infinity (hence `#NUM!` via 
`checkValue`), `<= -1` is NaN, otherwise truncate and use the int version. 
`FACT(170.9)` is still `170!`.
   - **`ROUND(1.5,1E10)`, `TRUNC(1.5,-1E10)`, `ROUNDUP`/`ROUNDDOWN`** threw. 
Digit counts *within* the int range but in the hundreds of millions were worse: 
`BigDecimal.setScale` built a number with that many digits and 
`ROUND(1.5,100000000)` ran for minutes. Digit counts are now clamped to ±400, 
beyond which rounding a double (15 significant digits, decimal exponent within 
±324) cannot change the result — `ROUND(x,400)` and `ROUND(x,1E10)` give the 
same value as before for any `x`.
   
   I couldn't verify what Excel returns for `ROUND(1.5,1E10)` specifically (the 
clamp makes it `1.5`, i.e. the same as any large digit count, rather than an 
error), so happy to change that if you know.
   
   Not touched: the other `safeDoubleToInt` call sites (`DOLLAR` digits, 
`DATE`, `EDATE`, `EOMONTH`, `WORKDAY`, `REPT`, `ADDRESS`, `COMBIN`, `POISSON`, 
...) have the same latent exception for absurd arguments; they can go in a 
later PR if wanted.
   
   Tests: new `TestQuotient.testQuotientOutsideIntRange`, 
`TestMathX.testFactorialDouble`, `TestNumericFunction.testFACTOutOfIntRange` / 
`testROUNDWithHugeDigitCount`. Ran `TestNumericFunction`, `TestQuotient`, 
`TestQuotientFunctionsFromSpreadsheet`, `TestMathX`, `TestRoundFuncs`, 
`TestTrunc`, `TestMultiOperandNumericFunction` and 
`TestFormulasFromSpreadsheet` locally: 446 tests, 0 failures.
   
   🤖 Generated with [Claude Code](https://claude.com/claude-code)
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to