Skip to content
This repository has been archived by the owner on Mar 25, 2024. It is now read-only.

Commit

Permalink
Merge pull request #392 from dtolnay/positivenan
Browse files Browse the repository at this point in the history
Ensure that .nan deserialization produces positive NaN
  • Loading branch information
dtolnay committed Oct 25, 2023
2 parents 81b2d76 + fe45569 commit d094ba1
Show file tree
Hide file tree
Showing 3 changed files with 3 additions and 2 deletions.
2 changes: 1 addition & 1 deletion src/de.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1079,7 +1079,7 @@ pub(crate) fn parse_f64(scalar: &str) -> Option<f64> {
return Some(f64::NEG_INFINITY);
}
if let ".nan" | ".NaN" | ".NAN" = scalar {
return Some(f64::NAN);
return Some(f64::NAN.copysign(1.0));
}
if let Ok(float) = unpositive.parse::<f64>() {
if float.is_finite() {
Expand Down
1 change: 1 addition & 0 deletions tests/test_de.rs
Original file line number Diff line number Diff line change
Expand Up @@ -690,6 +690,7 @@ fn test_parse_number() {

let n = ".nan".parse::<Number>().unwrap();
assert_eq!(n, Number::from(f64::NAN));
assert!(n.as_f64().unwrap().is_sign_positive());

let n = ".inf".parse::<Number>().unwrap();
assert_eq!(n, Number::from(f64::INFINITY));
Expand Down
2 changes: 1 addition & 1 deletion tests/test_value.rs
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ fn test_nan() {
assert!(neg_fake_nan.is_string());

let significand_mask = 0xF_FFFF_FFFF_FFFF;
let bits = (f64::NAN.to_bits() ^ significand_mask) | 1;
let bits = (f64::NAN.copysign(1.0).to_bits() ^ significand_mask) | 1;
let different_pos_nan = Value::Number(Number::from(f64::from_bits(bits)));
assert_eq!(pos_nan, different_pos_nan);
}
Expand Down

0 comments on commit d094ba1

Please sign in to comment.