Skip to content

Commit

Permalink
Change neutral element of <fNN as iter::Sum> to neg_zero
Browse files Browse the repository at this point in the history
The neutral element used to be positive zero, but +0 + -0 = +0 so
-0 seems better indicated.
  • Loading branch information
krtab committed Aug 20, 2024
1 parent a971212 commit 4908188
Show file tree
Hide file tree
Showing 3 changed files with 30 additions and 2 deletions.
4 changes: 2 additions & 2 deletions library/core/src/iter/traits/accum.rs
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,7 @@ macro_rules! float_sum_product {
impl Sum for $a {
fn sum<I: Iterator<Item=Self>>(iter: I) -> Self {
iter.fold(
0.0,
-0.0,
#[rustc_inherit_overflow_checks]
|a, b| a + b,
)
Expand All @@ -126,7 +126,7 @@ macro_rules! float_sum_product {
impl<'a> Sum<&'a $a> for $a {
fn sum<I: Iterator<Item=&'a Self>>(iter: I) -> Self {
iter.fold(
0.0,
-0.0,
#[rustc_inherit_overflow_checks]
|a, b| a + b,
)
Expand Down
27 changes: 27 additions & 0 deletions library/core/tests/num/float_iter_sum_identity.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
#[test]
fn f32_ref() {
let x: f32 = -0.0;
let still_x: f32 = [x].iter().sum();
assert_eq!(1. / x, 1. / still_x)
}

#[test]
fn f32_own() {
let x: f32 = -0.0;
let still_x: f32 = [x].into_iter().sum();
assert_eq!(1. / x, 1. / still_x)
}

#[test]
fn f64_ref() {
let x: f64 = -0.0;
let still_x: f64 = [x].iter().sum();
assert_eq!(1. / x, 1. / still_x)
}

#[test]
fn f64_own() {
let x: f64 = -0.0;
let still_x: f64 = [x].into_iter().sum();
assert_eq!(1. / x, 1. / still_x)
}
1 change: 1 addition & 0 deletions library/core/tests/num/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ mod int_log;
mod ops;
mod wrapping;

mod float_iter_sum_identity;
mod ieee754;
mod nan;

Expand Down

0 comments on commit 4908188

Please sign in to comment.