Hi Joe,

> On Nov 5, 2019, at 6:04 PM, Joe Darcy <joe.da...@oracle.com> wrote:
> 
> Please review the changes to fix
> 
>     JDK-8233452: java.math.BigDecimal.sqrt() with RoundingMode.FLOOR results 
> in incorrect result
>     http://cr.openjdk.java.net/~darcy/8233452.0/ 
> <http://cr.openjdk.java.net/~darcy/8233452.0/>
> 
> Some background on the problem and fix.
> 
> The core of the BigDecimal.sqrt method is a Newton-Raphson loop.
> […]
> The Newton iteration reduces the error at each step and, as currently 
> written, it can settle on a value like 2, which is closer to the actual 
> answer, but *incorrect* according to the requested rounding mode.
> 
> There are a few ways to fix this one. One is to run the Newton loop to a 
> higher-precision where these finer distinctions can be teased out. […]
> 
> Another approach is to detect when the result is too large/too small and then 
> subtract/add an ulp as a fix-up. This is the approach taken for 
> BigDecimal.sqrt. […]

This implementation change looks reasonable to me.

> An approach not explored for this fix would be to arrange for the iteration 
> to start from the "right" side of the number line depending on the rounding 
> mode and then monotonically increase/decrease to approach the square root. 
> […] I believe this is technically possible, but would require some additional 
> analysis to setup.

This approach seems more appealing and could perhaps be investigated at a later 
date.

In the test I think you want to replace “down” with “up" at line 238.

Brian

Reply via email to