微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将结构与 Rust 中的浮点数进行比较

如何解决将结构与 Rust 中的浮点数进行比较

由于精度错误,我在使用浮点数 f64 时测试失败。

Playground

use std::ops::Sub;

#[derive(Debug,PartialEq,Clone,copy)]
struct Audio {
    amp: f64,}

impl Sub for Audio {
    type Output = Self;

    fn sub(self,other: Self) -> Self::Output {
        Self {
            amp: self.amp - other.amp,}
    }
}

#[test]
fn subtract_audio() {
    let audio1 = Audio { amp: 0.9 };
    let audio2 = Audio { amp: 0.3 };

    assert_eq!(audio1 - audio2,Audio { amp: 0.6 });
    assert_ne!(audio1 - audio2,Audio { amp: 1.2 });
    assert_ne!(audio1 - audio2,Audio { amp: 0.3 });
}

我收到以下错误

---- subtract_audio stdout ----
thread 'subtract_audio' panicked at 'assertion Failed: `(left == right)`
  left: `Audio { amp: 0.6000000000000001 }`,right: `Audio { amp: 0.6 }`',src/lib.rs:23:5

如何测试带有浮点数(如 f64 )的结构?

解决方法

如果比较不带结构的数字,

let a: f64 = 0.9;
let b: f64 = 0.6;

assert!(a - b < f64:EPSILON);

但是对于结构,我们需要采取额外的措施。 首先需要使用 PartialOrd 进行派生以允许与其他结构进行比较。

#[derive(Debug,PartialEq,PartialOrd)]
struct Audio {...}

接下来创建一个结构体进行比较

let audio_epsilon = Audio { amp: f64:EPSILON };

现在我可以定期比较(assert! 而不是 assert_eq!

assert!(c - d < audio_epsilon)

另一种解决方案是手动实现 PartialEq

impl PartialEq for Audio {
    fn eq(&self,other: &Self) -> bool {
        (self.amp - other.amp).abs() < f64::EPSILON
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。