Skip to content

variable-precision float operations can differ depending on optimization levels #124609

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
May 3, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
145 changes: 87 additions & 58 deletions library/std/src/f32.rs
Original file line number Diff line number Diff line change
Expand Up @@ -371,9 +371,10 @@ impl f32 {
/// It might have a different sequence of rounding operations than `powf`,
/// so the results are not guaranteed to agree.
///
/// # Platform-specific precision
/// # Unspecified precision
///
/// The precision of this function varies by platform and Rust version.
/// The precision of this function is non-deterministic. This means it varies by platform, Rust version, and
/// can even differ within the same execution from one invocation to the next.
///
/// # Examples
///
Expand All @@ -393,9 +394,10 @@ impl f32 {

/// Raises a number to a floating point power.
///
/// # Platform-specific precision
/// # Unspecified precision
///
/// The precision of this function varies by platform and Rust version.
/// The precision of this function is non-deterministic. This means it varies by platform, Rust version, and
/// can even differ within the same execution from one invocation to the next.
///
/// # Examples
///
Expand Down Expand Up @@ -444,9 +446,10 @@ impl f32 {

/// Returns `e^(self)`, (the exponential function).
///
/// # Platform-specific precision
/// # Unspecified precision
///
/// The precision of this function varies by platform and Rust version.
/// The precision of this function is non-deterministic. This means it varies by platform, Rust version, and
/// can even differ within the same execution from one invocation to the next.
///
/// # Examples
///
Expand All @@ -470,9 +473,10 @@ impl f32 {

/// Returns `2^(self)`.
///
/// # Platform-specific precision
/// # Unspecified precision
///
/// The precision of this function varies by platform and Rust version.
/// The precision of this function is non-deterministic. This means it varies by platform, Rust version, and
/// can even differ within the same execution from one invocation to the next.
///
/// # Examples
///
Expand All @@ -494,9 +498,10 @@ impl f32 {

/// Returns the natural logarithm of the number.
///
/// # Platform-specific precision
/// # Unspecified precision
///
/// The precision of this function varies by platform and Rust version.
/// The precision of this function is non-deterministic. This means it varies by platform, Rust version, and
/// can even differ within the same execution from one invocation to the next.
///
/// # Examples
///
Expand Down Expand Up @@ -524,9 +529,10 @@ impl f32 {
/// `self.log2()` can produce more accurate results for base 2, and
/// `self.log10()` can produce more accurate results for base 10.
///
/// # Platform-specific precision
/// # Unspecified precision
///
/// The precision of this function varies by platform and Rust version.
/// The precision of this function is non-deterministic. This means it varies by platform, Rust version, and
/// can even differ within the same execution from one invocation to the next.
///
/// # Examples
///
Expand All @@ -548,9 +554,10 @@ impl f32 {

/// Returns the base 2 logarithm of the number.
///
/// # Platform-specific precision
/// # Unspecified precision
///
/// The precision of this function varies by platform and Rust version.
/// The precision of this function is non-deterministic. This means it varies by platform, Rust version, and
/// can even differ within the same execution from one invocation to the next.
///
/// # Examples
///
Expand All @@ -572,9 +579,10 @@ impl f32 {

/// Returns the base 10 logarithm of the number.
///
/// # Platform-specific precision
/// # Unspecified precision
///
/// The precision of this function varies by platform and Rust version.
/// The precision of this function is non-deterministic. This means it varies by platform, Rust version, and
/// can even differ within the same execution from one invocation to the next.
///
/// # Examples
///
Expand All @@ -599,9 +607,10 @@ impl f32 {
/// * If `self <= other`: `0.0`
/// * Else: `self - other`
///
/// # Platform-specific precision
/// # Unspecified precision
///
/// The precision of this function varies by platform and Rust version.
/// The precision of this function is non-deterministic. This means it varies by platform, Rust version, and
/// can even differ within the same execution from one invocation to the next.
/// This function currently corresponds to the `fdimf` from libc on Unix
/// and Windows. Note that this might change in the future.
///
Expand Down Expand Up @@ -637,9 +646,10 @@ impl f32 {

/// Returns the cube root of a number.
///
/// # Platform-specific precision
/// # Unspecified precision
///
/// The precision of this function varies by platform and Rust version.
/// The precision of this function is non-deterministic. This means it varies by platform, Rust version, and
/// can even differ within the same execution from one invocation to the next.
/// This function currently corresponds to the `cbrtf` from libc on Unix
/// and Windows. Note that this might change in the future.
///
Expand All @@ -666,9 +676,10 @@ impl f32 {
/// right-angle triangle with other sides having length `x.abs()` and
/// `y.abs()`.
///
/// # Platform-specific precision
/// # Unspecified precision
///
/// The precision of this function varies by platform and Rust version.
/// The precision of this function is non-deterministic. This means it varies by platform, Rust version, and
/// can even differ within the same execution from one invocation to the next.
/// This function currently corresponds to the `hypotf` from libc on Unix
/// and Windows. Note that this might change in the future.
///
Expand All @@ -693,9 +704,10 @@ impl f32 {

/// Computes the sine of a number (in radians).
///
/// # Platform-specific precision
/// # Unspecified precision
///
/// The precision of this function varies by platform and Rust version.
/// The precision of this function is non-deterministic. This means it varies by platform, Rust version, and
/// can even differ within the same execution from one invocation to the next.
///
/// # Examples
///
Expand All @@ -716,9 +728,10 @@ impl f32 {

/// Computes the cosine of a number (in radians).
///
/// # Platform-specific precision
/// # Unspecified precision
///
/// The precision of this function varies by platform and Rust version.
/// The precision of this function is non-deterministic. This means it varies by platform, Rust version, and
/// can even differ within the same execution from one invocation to the next.
///
/// # Examples
///
Expand All @@ -739,9 +752,10 @@ impl f32 {

/// Computes the tangent of a number (in radians).
///
/// # Platform-specific precision
/// # Unspecified precision
///
/// The precision of this function varies by platform and Rust version.
/// The precision of this function is non-deterministic. This means it varies by platform, Rust version, and
/// can even differ within the same execution from one invocation to the next.
/// This function currently corresponds to the `tanf` from libc on Unix and
/// Windows. Note that this might change in the future.
///
Expand All @@ -765,9 +779,10 @@ impl f32 {
/// the range [-pi/2, pi/2] or NaN if the number is outside the range
/// [-1, 1].
///
/// # Platform-specific precision
/// # Unspecified precision
///
/// The precision of this function varies by platform and Rust version.
/// The precision of this function is non-deterministic. This means it varies by platform, Rust version, and
/// can even differ within the same execution from one invocation to the next.
/// This function currently corresponds to the `asinf` from libc on Unix
/// and Windows. Note that this might change in the future.
///
Expand All @@ -794,9 +809,10 @@ impl f32 {
/// the range [0, pi] or NaN if the number is outside the range
/// [-1, 1].
///
/// # Platform-specific precision
/// # Unspecified precision
///
/// The precision of this function varies by platform and Rust version.
/// The precision of this function is non-deterministic. This means it varies by platform, Rust version, and
/// can even differ within the same execution from one invocation to the next.
/// This function currently corresponds to the `acosf` from libc on Unix
/// and Windows. Note that this might change in the future.
///
Expand All @@ -822,9 +838,10 @@ impl f32 {
/// Computes the arctangent of a number. Return value is in radians in the
/// range [-pi/2, pi/2];
///
/// # Platform-specific precision
/// # Unspecified precision
///
/// The precision of this function varies by platform and Rust version.
/// The precision of this function is non-deterministic. This means it varies by platform, Rust version, and
/// can even differ within the same execution from one invocation to the next.
/// This function currently corresponds to the `atanf` from libc on Unix
/// and Windows. Note that this might change in the future.
///
Expand Down Expand Up @@ -854,9 +871,10 @@ impl f32 {
/// * `y >= 0`: `arctan(y/x) + pi` -> `(pi/2, pi]`
/// * `y < 0`: `arctan(y/x) - pi` -> `(-pi, -pi/2)`
///
/// # Platform-specific precision
/// # Unspecified precision
///
/// The precision of this function varies by platform and Rust version.
/// The precision of this function is non-deterministic. This means it varies by platform, Rust version, and
/// can even differ within the same execution from one invocation to the next.
/// This function currently corresponds to the `atan2f` from libc on Unix
/// and Windows. Note that this might change in the future.
///
Expand Down Expand Up @@ -890,9 +908,10 @@ impl f32 {
/// Simultaneously computes the sine and cosine of the number, `x`. Returns
/// `(sin(x), cos(x))`.
///
/// # Platform-specific precision
/// # Unspecified precision
///
/// The precision of this function varies by platform and Rust version.
/// The precision of this function is non-deterministic. This means it varies by platform, Rust version, and
/// can even differ within the same execution from one invocation to the next.
/// This function currently corresponds to the `(f32::sin(x),
/// f32::cos(x))`. Note that this might change in the future.
///
Expand All @@ -919,9 +938,10 @@ impl f32 {
/// Returns `e^(self) - 1` in a way that is accurate even if the
/// number is close to zero.
///
/// # Platform-specific precision
/// # Unspecified precision
///
/// The precision of this function varies by platform and Rust version.
/// The precision of this function is non-deterministic. This means it varies by platform, Rust version, and
/// can even differ within the same execution from one invocation to the next.
/// This function currently corresponds to the `expm1f` from libc on Unix
/// and Windows. Note that this might change in the future.
///
Expand All @@ -947,9 +967,10 @@ impl f32 {
/// Returns `ln(1+n)` (natural logarithm) more accurately than if
/// the operations were performed separately.
///
/// # Platform-specific precision
/// # Unspecified precision
///
/// The precision of this function varies by platform and Rust version.
/// The precision of this function is non-deterministic. This means it varies by platform, Rust version, and
/// can even differ within the same execution from one invocation to the next.
/// This function currently corresponds to the `log1pf` from libc on Unix
/// and Windows. Note that this might change in the future.
///
Expand All @@ -975,9 +996,10 @@ impl f32 {

/// Hyperbolic sine function.
///
/// # Platform-specific precision
/// # Unspecified precision
///
/// The precision of this function varies by platform and Rust version.
/// The precision of this function is non-deterministic. This means it varies by platform, Rust version, and
/// can even differ within the same execution from one invocation to the next.
/// This function currently corresponds to the `sinhf` from libc on Unix
/// and Windows. Note that this might change in the future.
///
Expand All @@ -1004,9 +1026,10 @@ impl f32 {

/// Hyperbolic cosine function.
///
/// # Platform-specific precision
/// # Unspecified precision
///
/// The precision of this function varies by platform and Rust version.
/// The precision of this function is non-deterministic. This means it varies by platform, Rust version, and
/// can even differ within the same execution from one invocation to the next.
/// This function currently corresponds to the `coshf` from libc on Unix
/// and Windows. Note that this might change in the future.
///
Expand All @@ -1033,9 +1056,10 @@ impl f32 {

/// Hyperbolic tangent function.
///
/// # Platform-specific precision
/// # Unspecified precision
///
/// The precision of this function varies by platform and Rust version.
/// The precision of this function is non-deterministic. This means it varies by platform, Rust version, and
/// can even differ within the same execution from one invocation to the next.
/// This function currently corresponds to the `tanhf` from libc on Unix
/// and Windows. Note that this might change in the future.
///
Expand All @@ -1062,9 +1086,10 @@ impl f32 {

/// Inverse hyperbolic sine function.
///
/// # Platform-specific precision
/// # Unspecified precision
///
/// The precision of this function varies by platform and Rust version.
/// The precision of this function is non-deterministic. This means it varies by platform, Rust version, and
/// can even differ within the same execution from one invocation to the next.
///
/// # Examples
///
Expand All @@ -1089,9 +1114,10 @@ impl f32 {

/// Inverse hyperbolic cosine function.
///
/// # Platform-specific precision
/// # Unspecified precision
///
/// The precision of this function varies by platform and Rust version.
/// The precision of this function is non-deterministic. This means it varies by platform, Rust version, and
/// can even differ within the same execution from one invocation to the next.
///
/// # Examples
///
Expand All @@ -1118,9 +1144,10 @@ impl f32 {

/// Inverse hyperbolic tangent function.
///
/// # Platform-specific precision
/// # Unspecified precision
///
/// The precision of this function varies by platform and Rust version.
/// The precision of this function is non-deterministic. This means it varies by platform, Rust version, and
/// can even differ within the same execution from one invocation to the next.
///
/// # Examples
///
Expand All @@ -1143,9 +1170,10 @@ impl f32 {

/// Gamma function.
///
/// # Platform-specific precision
/// # Unspecified precision
///
/// The precision of this function varies by platform and Rust version.
/// The precision of this function is non-deterministic. This means it varies by platform, Rust version, and
/// can even differ within the same execution from one invocation to the next.
/// This function currently corresponds to the `tgammaf` from libc on Unix
/// and Windows. Note that this might change in the future.
///
Expand All @@ -1171,9 +1199,10 @@ impl f32 {
///
/// The integer part of the tuple indicates the sign of the gamma function.
///
/// # Platform-specific precision
/// # Unspecified precision
///
/// The precision of this function varies by platform and Rust version.
/// The precision of this function is non-deterministic. This means it varies by platform, Rust version, and
/// can even differ within the same execution from one invocation to the next.
/// This function currently corresponds to the `lgamma_r` from libc on Unix
/// and Windows. Note that this might change in the future.
///
Expand Down
Loading
Loading