gpt4 book ai didi

rust - 涉及复数和浮点值的运算符重载

转载 作者:行者123 更新时间:2023-11-29 08:05:33 24 4
gpt4 key购买 nike

更新:此错误已由 https://github.com/rust-lang/rust/pull/23673 修复.下面的代码现在可以工作了。


在数学和数值编程中,人们期望复数与实数(浮点)值无缝互操作。是否可以在 Rust 中定义 struct Complex<T: Float>允许涉及类型值的对称数学运算 T

例如,可以定义运算符*输入 (Complex<T>, Complex<T>)(Complex<T>, T)如下:

use std::ops::Mul;
use std::num::Float;

#[derive(Copy, Debug)]
pub struct Complex<T: Float> {
pub re: T, pub im: T
}

impl<T: Float> Complex<T> {
pub fn new(re: T, im: T) -> Complex<T> {
Complex { re: re, im: im }
}
}

impl<T: Float> Mul<Complex<T>> for Complex<T> {
type Output = Complex<T>;

fn mul(self, other: Complex<T>) -> Complex<T> {
Complex::new(self.re * other.re - self.im * other.im,
self.re * other.im + self.im * other.re)
}
}

impl<T: Float> Mul<T> for Complex<T> {
type Output = Complex<T>;

fn mul(self, other: T) -> Complex<T> {
Complex::new(self.re * other, self.im * other)
}
}

是否可以重载*还可以处理输入 (T, Complex<T>) ?例如,以下不起作用:

impl Mul<Complex<f64>> for f64 {
type Output = Complex<f64>;
fn mul(self, other: Complex<f64>) -> Complex<f64> {
Complex::new(self * other.re, self * other.im)
}
}

fn main() {
let x = Complex::new(1.0, 1.0);
let y = x*x;
let z = x*4.0;
let w = 4.0*x;
}

我收到错误信息:

 error: mismatched types:
expected `_`,
found `Complex<_>`
(expected floating-point variable,
found struct `Complex`) [E0308]
src/main.rs:61 let w = 4.0*x;
^

在 Scala 中,可以通过从 T 进行隐式转换来解决这个问题。至 Complex<T> . Rust 中有类似的技巧吗?有没有更好的方法来定义一个高效的、通用的 *手术?谢谢。

最佳答案

这应该是允许的,但是有一个 outstanding issue当自定义实现正在运行时,可以防止在操作的左侧使用内置类型(u8f32 等)。

目前建议的解决方法是将自定义类型放在左侧,将内置类型放在右侧。

关于rust - 涉及复数和浮点值的运算符重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28748852/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com