Open
Description
Location
library/std/src/f64.rs:793
Summary
The f64::atan2
function documentation specifies that the output could be in the range (-PI, PI]
. However its not true. It could return -PI
as well.
Following is from the function documentation:
/// * `x = 0`, `y = 0`: `0` /// * `x >= 0`: `arctan(y/x)` -> `[-pi/2, pi/2]` /// * `y >= 0`: `arctan(y/x) + pi` -> `(pi/2, pi]` /// * `y < 0`: `arctan(y/x) - pi` -> `(-pi, -pi/2)`
Example case:
f64::atan2(-0.0, -1.0)
returns -f64::PI
Metadata
Metadata
Assignees
Labels
Area: Documentation for any part of the project, including the compiler, standard library, and toolsArea: Floating point numbers and arithmeticCategory: This is a bug.Call for participation: Easy difficulty. Experience needed to fix: Not much. Good first issue.Relevant to the library team, which will review and decide on the PR/issue.
Activity
GrigorenkoPV commentedon Feb 17, 2025
From my testing,
f32::atan2(y, x).is_sign_positive() == y.is_sign_positive()
. I was even able to make kani prove that for thelibm
implementation.@rustbot claim
I think I'll put up a PR adjusting documentation.
lolbinarycat commentedon Apr 9, 2025
triage: @GrigorenkoPV still planning on working on this?
also note that this should be updated for other float types too (f16, f32, and f128)
GrigorenkoPV commentedon Apr 14, 2025
I do, but not sure when I will have time, so I should probably unclaim this for now.
@rustbot release-assignment
Also, I think the fix here is pretty easy: as I see it, one just needs to mention that the sign of the result is the same as the sign of the first argument, and that
-0
&+0
both exist with floats and are two slightly different things.So probably just specify the output ranges for four of the cases:
x >= +0, y >= +0
x <= -0, y >= +0
x >= +0, y <= -0
x <= -0, y <= -0
@rustbot label +E-easy
whirlwindaster commentedon Apr 14, 2025
@rustbot claim
atan2
can return-PI
#140487