diff --git a/src/ser.rs b/src/ser.rs index 6b7ceb7a..5b2d17f8 100644 --- a/src/ser.rs +++ b/src/ser.rs @@ -514,7 +514,16 @@ impl ser::Serializer for SerializerToYaml { } fn serialize_f32(self, v: f32) -> Result { - self.serialize_f64(v as f64) + Ok(Yaml::Real(match v.classify() { + num::FpCategory::Infinite if v.is_sign_positive() => ".inf".into(), + num::FpCategory::Infinite => "-.inf".into(), + num::FpCategory::Nan => ".nan".into(), + _ => { + let mut buf = vec![]; + ::dtoa::write(&mut buf, v).unwrap(); + ::std::str::from_utf8(&buf).unwrap().into() + } + })) } fn serialize_f64(self, v: f64) -> Result { diff --git a/tests/test_serde.rs b/tests/test_serde.rs index 734998c2..326f9075 100644 --- a/tests/test_serde.rs +++ b/tests/test_serde.rs @@ -135,6 +135,38 @@ fn test_float() { assert!(float.is_nan()); } +#[test] +fn test_float32() { + let thing: f32 = 25.6; + let yaml = indoc! {" + --- + 25.6 + "}; + test_serde(&thing, yaml); + + let thing = f32::INFINITY; + let yaml = indoc! {" + --- + .inf + "}; + test_serde(&thing, yaml); + + let thing = f32::NEG_INFINITY; + let yaml = indoc! {" + --- + -.inf + "}; + test_serde(&thing, yaml); + + let single_float: f32 = serde_yaml::from_str(indoc! {" + --- + .nan + "}) + .unwrap(); + assert!(single_float.is_nan()); + +} + #[test] fn test_vec() { let thing = vec![1, 2, 3];