DoubleFloats.jl icon indicating copy to clipboard operation
DoubleFloats.jl copied to clipboard

Poor accuracy of `cos` just below pi with Double64

Open moble opened this issue 3 years ago • 3 comments

For values close to — but just below — pi, the result of cos is quite jittery and significantly less accurate than values just above pi. I actually don't understand how the latter are so accurate; it would be nice if the former could be so accurate as well. But the real problem is that the values just below pi actually exceed the bounds [-1,1] that one expects for cos. This causes me various DomainErrors down the line in tests that pass with Julia's built-in float types.

Looking at the code, it seems like this line is the relevant path. And from that I find very similar behavior for sin just below (but not above) pi/2. I wonder if more branches with qrtrpi and threeqrtrpi (using corresponding symmetries) would be better for these cases.

T = Double64
x = LinRange(T(π)-T(5e-16), T(π)+T(5e-16), 10_000)
y = cos.(x)

cos_theta_Double64

moble avatar Feb 20 '23 20:02 moble

fixed

JeffreySarnoff avatar Feb 09 '24 04:02 JeffreySarnoff

@JeffreySarnoff I just installed main in a fresh project and got essentially the same result:

UpdatedDoubleFloatCosIssue

For reference, here's the complete reproducer for the plot above:

using Pkg
Pkg.activate(; temp=true)
Pkg.add(url="https://github.com/JuliaMath/DoubleFloats.jl#main")
Pkg.add("PythonPlot")

using PythonPlot
using DoubleFloats

T = Double64
x = LinRange(T(π)-T(5e-16), T(π)+T(5e-16), 10_000)
y = cos.(x)

plot(x.-pi, y.+1)
axhline(0, c="black")
xlabel(raw"$\theta - \pi$")
ylabel(raw"$\cos\theta + 1$")

moble avatar Feb 09 '24 18:02 moble

ok reopening

JeffreySarnoff avatar Feb 09 '24 19:02 JeffreySarnoff