gpt4 book ai didi

rust - 在 Rust 中使用 `num::Float` 特性并与基本类型交互时如何最小化样板文件的数量

转载 作者:行者123 更新时间:2023-11-29 08:26:10 25 4
gpt4 key购买 nike

在使用 num::Float 特性并与 Rust 中的原始类型交互时,是否有一种好的方法可以最大限度地减少样板文件的数量?例如,考虑一个写得不好的二次方程求解器

// External libraries
use num::Float;

// Poorly written quadratic formula solver for a x^2 + bx + c
fn myquad <Real> (a : Real, b : Real, c : Real) -> Option<(Real,Real)>
where
Real : Float
{
let mysqrt = Real::sqrt(b.powi(2)-Real::from(4.0)?*a*c);
let r1 = (-b+mysqrt)/(Real::from(2.0)?*a);
let r2 = (-b-mysqrt)/(Real::from(2.0)?*a);
Some((r1,r2))
}

// Write a couple of tests
fn main() {
let r1 = myquad::<f32> (1.0,1.0,-6.0).unwrap();
println!("Roots of (x-2) (x+3): ({},{})",r1.0,r1.1);
let r2 = myquad::<f64> (6.0,5.0,-4.0).unwrap();
println!("Roots of (2x-1) (3x+4): ({},{})",r2.0,r2.1);
}

我希望 myquad 例程适用于 f32f64 以外的各种浮点类型,但也适用于它们出色地。也就是说,有一组重复的 Real::from(x)? 形式的包装器,其中 x 是原始浮点类型。虽然我理解类型一致性的必要性,但这有点冗长,而且我担心这些包装器的可管理性对于具有大量原语的更复杂的例程。有没有更好的方法来处理这些转换或让它们隐式工作?可以肯定的是,答案可能是否定的,但我想在处理更复杂的例程之前了解此成本。

最佳答案

你遇到这个障碍的原因是因为你期待 num::Float成为一个实现的特征。 不是。它的目的是作为一个extension trait .

f32 都实现了它和 f64并允许您使用它在这些类型上实现的所有方法,而无需在类型本身中实现它们。

然而,这并不意味着您可以神奇地添加 T: Float但是,因为您的操作需要乘法和减法,所以一定要摆脱困境。因此,您的常量(正如您自己发现的那样)需要实现 Sub<X>Mul<X> , 其中X是您为常量选择的类型。

然而,有一个技巧。如果你知道常量的类型......你可以要求From<X> (其中 X 是常量的类型)。这意味着您可以在要求 float 大小的下限的情况下轻松解决这个问题。

这个下限要求在您的情况下不是问题,因为您依赖于 powinum::Float 上声明的方法,并且此特征仅针对两种原始类型实现:f32f64 .如果你想使用,比方说,half::f16 , 你需要摆脱对 powi 的调用.因此,需要 f32因为下限是完全可以接受的。

fn myquad<T:Float + From<f32>>(a : T, b: T, c: T) -> Option<(T, T)>
{
let mysqrt = (b.powi(2) - a * c * (4.0.into())).sqrt();
let r1 = (-b+mysqrt)/(a * 2.0.into());
let r2 = (-b-mysqrt)/(a * 2.0.into());
Some((r1,r2))
}

我认为就样板文件而言,您可以做到这一点。

关于rust - 在 Rust 中使用 `num::Float` 特性并与基本类型交互时如何最小化样板文件的数量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57813022/

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