# Conflict API definitions of Math.pow(x, 0.5) and Math.sqrt(x) for x={-0.0, Double.NEGATIVE_INFINITY}

jiefu(傅杰) jiefu at tencent.com
Mon Apr 12 06:51:27 UTC 2021

```Hi all,

I found Math.pow(x, 0.5) and Math.sqrt(x) would compute different values as the following:
```
Math.pow(-0.0, 0.5) = 0.0
Math.sqrt(-0.0) = -0.0

Math.pow(Double.NEGATIVE_INFINITY, 0.5) = Infinity
Math.sqrt(Double.NEGATIVE_INFINITY) = NaN
```

The reason is that both of pow and sqrt have special rules for these computations.
For example, this rule  specifies Math.pow(-0.0, 0.5) must be 0.0.
And this one  specifies Math.sqrt(-0.0) must be -0.0.
And we do have rules for Math.pow(Double.NEGATIVE_INFINITY, 0.5) = Infinity and Math.sqrt(Double.NEGATIVE_INFINITY) = NaN too.

I think most people will be confused by these rules because from the view of mathematics, Math.pow(x, 0.5) should be equal to Math.sqrt(x).

So why Java creates conflict special rules for them?
Is it possible to let Math.pow(-0.0, 0.5) = -0.0 and Math.pow(Double.NEGATIVE_INFINITY, 0.5) = NaN also be allowed?

I came across this problem when I was trying to optimize pow(x, 0.5) with sqrt(x).
If pow(x, 0.5)'s two special rules can be aligned with sqrt(x), then pow(x, 0.5)'s performance can be improved by 7x~14x .

Thanks.
Best regards,
Jie

 https://github.com/openjdk/jdk/blob/master/src/java.base/share/classes/java/lang/Math.java#L644
 https://github.com/openjdk/jdk/blob/master/src/java.base/share/classes/java/lang/Math.java#L385
 https://github.com/openjdk/jdk/pull/3404/
```

More information about the core-libs-dev mailing list