国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Rust 復(fù)數(shù)運(yùn)算,重載加減乘除運(yùn)算

這篇具有很好參考價值的文章主要介紹了Rust 復(fù)數(shù)運(yùn)算,重載加減乘除運(yùn)算。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報違法"按鈕提交疑問。

Rust 復(fù)數(shù)運(yùn)算,重載加減乘除運(yùn)算,Rust,算法,rust

復(fù)數(shù)

基本概念

復(fù)數(shù)定義

由實(shí)數(shù)部分和虛數(shù)部分所組成的數(shù),形如a+bi 。

其中a、b為實(shí)數(shù),i 為“虛數(shù)單位”,i2 = -1,即虛數(shù)單位的平方等于-1。

a、b分別叫做復(fù)數(shù)a+bi的實(shí)部和虛部。

當(dāng)b=0時,a+bi=a 為實(shí)數(shù);
當(dāng)b≠0時,a+bi 又稱虛數(shù);
當(dāng)b≠0、a=0時,bi 稱為純虛數(shù)。

實(shí)數(shù)和虛數(shù)都是復(fù)數(shù)的子集。如同實(shí)數(shù)可以在數(shù)軸上表示一樣復(fù)數(shù)也可以在平面上表示,復(fù)數(shù)x+yi以坐標(biāo)點(diǎn)(x,y)來表示。表示復(fù)數(shù)的平面稱為“復(fù)平面”。

復(fù)數(shù)相等

兩個復(fù)數(shù)不能比較大小,但當(dāng)個兩個復(fù)數(shù)的實(shí)部和虛部分別相等時,即表示兩個復(fù)數(shù)相等。

共軛復(fù)數(shù)

如果兩個復(fù)數(shù)的實(shí)部相等,虛部互為相反數(shù),那么這兩個復(fù)數(shù)互為共軛復(fù)數(shù)。

復(fù)數(shù)的模

復(fù)數(shù)的實(shí)部與虛部的平方和的正的平方根的值稱為該復(fù)數(shù)的模,數(shù)學(xué)上用與絕對值“|z|”相同的符號來表示。雖然從定義上是不相同的,但兩者的物理意思都表示“到原點(diǎn)的距離”。

復(fù)數(shù)的四則運(yùn)算

加法(減法)法則

復(fù)數(shù)的加法法則:設(shè)z1=a+bi,z2 =c+di是任意兩個復(fù)數(shù)。兩者和的實(shí)部是原來兩個復(fù)數(shù)實(shí)部的和,它的虛部是原來兩個虛部的和。兩個復(fù)數(shù)的和依然是復(fù)數(shù)。

即(a+bi)±(c+di)=(a±c)+(b±d)

乘法法則

復(fù)數(shù)的乘法法則:把兩個復(fù)數(shù)相乘,類似兩個多項(xiàng)式相乘,結(jié)果中i2=-1,把實(shí)部與虛部分別合并。兩個復(fù)數(shù)的積仍然是一個復(fù)數(shù)。

即(a+bi)(c+di)=(ac-bd)+(bc+ad)i

除法法則

復(fù)數(shù)除法法則:滿足(c+di)(x+yi)=(a+bi)的復(fù)數(shù)x+yi(x,y∈R)叫復(fù)數(shù)a+bi除以復(fù)數(shù)c+di的商。

運(yùn)算方法:可以把除法換算成乘法做,將分子分母同時乘上分母的共軛復(fù)數(shù),再用乘法運(yùn)算。

即(a+bi)/(c+di)=(a+bi)(c-di)/(c*c+d*d)=[(ac+bd)+(bc-ad)i]/(c*c+d*d)

復(fù)數(shù)的Rust代碼實(shí)現(xiàn)

結(jié)構(gòu)定義

Rust語言中,沒有像python一樣內(nèi)置complex復(fù)數(shù)數(shù)據(jù)類型,我們可以用兩個浮點(diǎn)數(shù)分別表示復(fù)數(shù)的實(shí)部和虛部,自定義一個結(jié)構(gòu)數(shù)據(jù)類型,表示如下:

struct Complex {
? ? real: f64,
? ? imag: f64,
}

示例代碼:

#[derive(Debug)]
struct Complex {
    real: f64,
    imag: f64,
}

impl Complex {  
    fn new(real: f64, imag: f64) -> Self {
        Complex { real, imag }  
    }
}

fn main() {  
    let z = Complex::new(3.0, 4.0);
    println!("{:?}", z);
    println!("{} + {}i", z.real, z.imag);
}

注意:#[derive(Debug)] 自動定義了復(fù)數(shù)結(jié)構(gòu)的輸出格式,如以上代碼輸出如下:

Complex { real: 3.0, imag: 4.0 }
3 + 4i

重載四則運(yùn)算

復(fù)數(shù)數(shù)據(jù)結(jié)構(gòu)不能直接用加減乘除來做復(fù)數(shù)運(yùn)算,需要導(dǎo)入標(biāo)準(zhǔn)庫ops的運(yùn)算符:

use std::ops::{Add, Sub, Mul, Div, Neg};

Add, Sub, Mul, Div, Neg 分別表示加減乘除以及相反數(shù),類似C++或者python語言中“重載運(yùn)算符”的概念。

根據(jù)復(fù)數(shù)的運(yùn)算法則,寫出對應(yīng)代碼:

fn add(self, other: Complex) -> Complex {
? ? Complex {
? ? ? ? real: self.real + other.real,
? ? ? ? imag: self.imag + other.imag,
? ? } ?
} ?

fn sub(self, other: Complex) -> Complex {
? ? Complex { ?
? ? ? ? real: self.real - other.real,
? ? ? ? imag: self.imag - other.imag,
? ? } ?
}?

fn mul(self, other: Complex) -> Complex { ?
? ? let real = self.real * other.real - self.imag * other.imag;
? ? let imag = self.real * other.imag + self.imag * other.real;
? ? Complex { real, imag } ?
} ?

fn div(self, other: Complex) -> Complex {
? ? let real = (self.real * other.real + self.imag * other.imag) / (other.real * other.real + other.imag * other.imag);
? ? let imag = (self.imag * other.real - self.real * other.imag) / (other.real * other.real + other.imag * other.imag);
? ? Complex { real, imag }
}

fn neg(self) -> Complex {
? ? Complex {
? ? ? ? real: -self.real,
? ? ? ? imag: -self.imag,
? ? }
}

Rust 重載運(yùn)算的格式,請見如下示例代碼:

use std::ops::{Add, Sub, Mul, Div, Neg};

#[derive(Clone, Debug, PartialEq)]
struct Complex {
    real: f64,
    imag: f64,
}

impl Complex {  
    fn new(real: f64, imag: f64) -> Self {
        Complex { real, imag }  
    }
  
    fn conj(&self) -> Self {
        Complex { real: self.real, imag: -self.imag }
    }

    fn abs(&self) -> f64 {
        (self.real * self.real + self.imag * self.imag).sqrt()
    }
}

fn abs(z: Complex) -> f64 {
    (z.real * z.real + z.imag * z.imag).sqrt()
}

impl Add<Complex> for Complex {
    type Output = Complex;

    fn add(self, other: Complex) -> Complex {
        Complex {
            real: self.real + other.real,
            imag: self.imag + other.imag,
        }  
    }  
}  
  
impl Sub<Complex> for Complex {
    type Output = Complex;
  
    fn sub(self, other: Complex) -> Complex {
        Complex {  
            real: self.real - other.real,
            imag: self.imag - other.imag,
        }  
    } 
}  
  
impl Mul<Complex> for Complex {
    type Output = Complex;  
  
    fn mul(self, other: Complex) -> Complex {  
        let real = self.real * other.real - self.imag * other.imag;
        let imag = self.real * other.imag + self.imag * other.real;
        Complex { real, imag }  
    }  
}

impl Div<Complex> for Complex {
    type Output = Complex;
  
    fn div(self, other: Complex) -> Complex {
        let real = (self.real * other.real + self.imag * other.imag) / (other.real * other.real + other.imag * other.imag);
        let imag = (self.imag * other.real - self.real * other.imag) / (other.real * other.real + other.imag * other.imag);
        Complex { real, imag }
    }
}  
  
impl Neg for Complex {
    type Output = Complex;
  
    fn neg(self) -> Complex {
        Complex {
            real: -self.real,
            imag: -self.imag,
        }
    }
}

fn main() {  
    let z1 = Complex::new(2.0, 3.0);
    let z2 = Complex::new(3.0, 4.0);
    let z3 = Complex::new(3.0, -4.0);

    // 復(fù)數(shù)的四則運(yùn)算
    let complex_add = z1.clone() + z2.clone();
    println!("{:?} + {:?} = {:?}", z1, z2, complex_add);

    let complex_sub = z1.clone() - z2.clone();
    println!("{:?} - {:?} = {:?}", z1, z2, complex_sub);

    let complex_mul = z1.clone() * z2.clone();
    println!("{:?} * {:?} = {:?}", z1, z2, complex_mul);

    let complex_div = z2.clone() / z3.clone();
    println!("{:?} / {:?} = {:?}", z1, z2, complex_div);

    // 對比兩個復(fù)數(shù)是否相等
    println!("{:?}", z1 == z2);
    // 共軛復(fù)數(shù)
    println!("{:?}", z2 == z3.conj());
    // 復(fù)數(shù)的相反數(shù)
    println!("{:?}", z2 == -z3.clone() + Complex::new(6.0,0.0));

    // 復(fù)數(shù)的模
    println!("{}", z1.abs());
    println!("{}", z2.abs());
    println!("{}", abs(z3));
}

輸出:

Complex { real: 2.0, imag: 3.0 } + Complex { real: 3.0, imag: 4.0 } = Complex { real: 5.0, imag: 7.0 }
Complex { real: 2.0, imag: 3.0 } - Complex { real: 3.0, imag: 4.0 } = Complex { real: -1.0, imag: -1.0 }
Complex { real: 2.0, imag: 3.0 } * Complex { real: 3.0, imag: 4.0 } = Complex { real: -6.0, imag: 17.0 }
Complex { real: 2.0, imag: 3.0 } / Complex { real: 3.0, imag: 4.0 } = Complex { real: -0.28, imag: 0.96 }
false
true
true
3.605551275463989
5
5

示例代碼中,同時還定義了復(fù)數(shù)的模 abs(),共軛復(fù)數(shù) conj()。

兩個復(fù)數(shù)的相等比較 z1 == z2,需要?#[derive(PartialEq)] 支持。

自定義 trait Display

復(fù)數(shù)結(jié)構(gòu)的原始 Debug trait 表達(dá)的輸出格式比較繁復(fù),如:

Complex { real: 2.0, imag: 3.0 } + Complex { real: 3.0, imag: 4.0 } = Complex { real: 5.0, imag: 7.0 }

想要輸出和數(shù)學(xué)中相同的表達(dá)(如 a + bi),需要自定義一個 Display trait,代碼如下:

impl std::fmt::Display for Complex {
? ? fn fmt(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result {
? ? ? ? if self.imag == 0.0 {
? ? ? ? ? ? formatter.write_str(&format!("{}", self.real))
? ? ? ? } else {
? ? ? ? ? ? let (abs, sign) = if self.imag > 0.0 { ?
? ? ? ? ? ? ? ? (self.imag, "+" )
? ? ? ? ? ? } else {
? ? ? ? ? ? ? ? (-self.imag, "-" )
? ? ? ? ? ? };
? ? ? ? ? ? if abs == 1.0 {
? ? ? ? ? ? ? ? formatter.write_str(&format!("({} {} i)", self.real, sign))
? ? ? ? ? ? } else {
? ? ? ? ? ? ? ? formatter.write_str(&format!("({} {} {}i)", self.real, sign, abs))
? ? ? ? ? ? }
? ? ? ? }
? ? }
}

輸出格式分三種情況:虛部為0,正數(shù)和負(fù)數(shù)。另外當(dāng)虛部絕對值為1時省略1僅輸出i虛數(shù)單位。

完整代碼如下:

use std::ops::{Add, Sub, Mul, Div, Neg};

#[derive(Clone, PartialEq)]
struct Complex {
    real: f64,
    imag: f64,
}

impl std::fmt::Display for Complex {
    fn fmt(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result {
        if self.imag == 0.0 {
            formatter.write_str(&format!("{}", self.real))
        } else {
            let (abs, sign) = if self.imag > 0.0 {  
                (self.imag, "+" )
            } else {
                (-self.imag, "-" )
            };
            if abs == 1.0 {
                formatter.write_str(&format!("({} {} i)", self.real, sign))
            } else {
                formatter.write_str(&format!("({} {} {}i)", self.real, sign, abs))
            }
        }
    }
}

impl Complex {  
    fn new(real: f64, imag: f64) -> Self {
        Complex { real, imag }  
    }
  
    fn conj(&self) -> Self {
        Complex { real: self.real, imag: -self.imag }
    }

    fn abs(&self) -> f64 {
        (self.real * self.real + self.imag * self.imag).sqrt()
    }
}

fn abs(z: Complex) -> f64 {
    (z.real * z.real + z.imag * z.imag).sqrt()
}

impl Add<Complex> for Complex {
    type Output = Complex;

    fn add(self, other: Complex) -> Complex {
        Complex {
            real: self.real + other.real,
            imag: self.imag + other.imag,
        }  
    }  
}  
  
impl Sub<Complex> for Complex {
    type Output = Complex;
  
    fn sub(self, other: Complex) -> Complex {
        Complex {  
            real: self.real - other.real,
            imag: self.imag - other.imag,
        }  
    } 
}  
  
impl Mul<Complex> for Complex {
    type Output = Complex;  
  
    fn mul(self, other: Complex) -> Complex {  
        let real = self.real * other.real - self.imag * other.imag;
        let imag = self.real * other.imag + self.imag * other.real;
        Complex { real, imag }  
    }  
}

impl Div<Complex> for Complex {
    type Output = Complex;
  
    fn div(self, other: Complex) -> Complex {
        let real = (self.real * other.real + self.imag * other.imag) / (other.real * other.real + other.imag * other.imag);
        let imag = (self.imag * other.real - self.real * other.imag) / (other.real * other.real + other.imag * other.imag);
        Complex { real, imag }
    }
}  
  
impl Neg for Complex {
    type Output = Complex;
  
    fn neg(self) -> Complex {
        Complex {
            real: -self.real,
            imag: -self.imag,
        }
    }
}

fn main() {
    let z1 = Complex::new(2.0, 3.0);
    let z2 = Complex::new(3.0, 4.0);
    let z3 = Complex::new(3.0, -4.0);

    // 復(fù)數(shù)的四則運(yùn)算
    let complex_add = z1.clone() + z2.clone();
    println!("{} + {} = {}", z1, z2, complex_add);

    let z = Complex::new(1.5, 0.5);
    println!("{} + {} = {}", z, z, z.clone() + z.clone());

    let complex_sub = z1.clone() - z2.clone();
    println!("{} - {} = {}", z1, z2, complex_sub);

    let complex_sub = z1.clone() - z1.clone();
    println!("{} - {} = {}", z1, z1, complex_sub);

    let complex_mul = z1.clone() * z2.clone();
    println!("{} * {} = {}", z1, z2, complex_mul);

    let complex_mul = z2.clone() * z3.clone();
    println!("{} * {} = {}", z2, z3, complex_mul);

    let complex_div = z2.clone() / z3.clone();
    println!("{} / {} = {}", z1, z2, complex_div);

    let complex_div = Complex::new(1.0,0.0) / z2.clone();
    println!("1 / {} = {}", z2, complex_div);

    // 對比兩個復(fù)數(shù)是否相等
    println!("{:?}", z1 == z2);
    // 共軛復(fù)數(shù)
    println!("{:?}", z2 == z3.conj());
    // 復(fù)數(shù)的相反數(shù)
    println!("{:?}", z2 == -z3.clone() + Complex::new(6.0,0.0));

    // 復(fù)數(shù)的模
    println!("{}", z1.abs());
    println!("{}", z2.abs());
    println!("{}", abs(z3));
}

輸出:

(2 + 3i) + (3 + 4i) = (5 + 7i)
(1.5 + 0.5i) + (1.5 + 0.5i) = (3 + i)
(2 + 3i) - (3 + 4i) = (-1 - i)
(2 + 3i) - (2 + 3i) = 0
(2 + 3i) * (3 + 4i) = (-6 + 17i)
(3 + 4i) * (3 - 4i) = 25
(2 + 3i) / (3 + 4i) = (-0.28 + 0.96i)
1 / (3 + 4i) = (0.12 - 0.16i)
false
true
true
3.605551275463989
5
5


小結(jié)

如此,復(fù)數(shù)的四則運(yùn)算基本都實(shí)現(xiàn)了,當(dāng)然復(fù)數(shù)還有三角表示式和指數(shù)表示式,根據(jù)它們的數(shù)學(xué)定義寫出相當(dāng)代碼應(yīng)該不是很難。有了復(fù)數(shù)三角式,就能方便地定義出復(fù)數(shù)的開方運(yùn)算,有空可以寫寫這方面的代碼。

本文完文章來源地址http://www.zghlxwxcb.cn/news/detail-648091.html

到了這里,關(guān)于Rust 復(fù)數(shù)運(yùn)算,重載加減乘除運(yùn)算的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • C語言加減乘除運(yùn)算

    加減乘除是常見的數(shù)學(xué)運(yùn)算,C語言當(dāng)然支持,不過,C語言中的運(yùn)算符號與數(shù)學(xué)中的略有不同,請見下表。 加法 減法 乘法 除法 求余數(shù)(取余) 數(shù)學(xué) + - × ÷ 無 C語言 + - * / % C語言中的加號、減號與數(shù)學(xué)中的一樣,乘號、除號不同;另外C語言還多了一個求余數(shù)的運(yùn)算符,就是

    2024年02月06日
    瀏覽(16)
  • 只使用位運(yùn)算實(shí)現(xiàn)加減乘除

    只使用位運(yùn)算實(shí)現(xiàn)加減乘除

    在線OJ: LeetCode 29. 兩數(shù)相除 原題目的要求是不能使用乘法, 除法和取余運(yùn)算符實(shí)現(xiàn)除法. 在本篇博客中把題目要求提高一點(diǎn), 這里只使用位運(yùn)算來實(shí)現(xiàn), 順便的也就把只使用位運(yùn)算實(shí)現(xiàn)加減乘除實(shí)現(xiàn)了. 首先我們需要知道兩數(shù)之和可以是兩個數(shù)位相加和不進(jìn)位相加之和, 而兩數(shù)進(jìn)

    2024年02月06日
    瀏覽(45)
  • Pytorch入門:Tensor加減乘除矩陣運(yùn)算

    若張量維數(shù)大于2,則對最后兩維進(jìn)行matmul。進(jìn)行此運(yùn)算的要求是張量a與b除最后兩維外的其他維必須一致:

    2024年02月12日
    瀏覽(25)
  • 用Vue的三種方法實(shí)現(xiàn)加減乘除運(yùn)算

    用Vue的三種方法實(shí)現(xiàn)加減乘除運(yùn)算

    js插件:vue.js 教程: 首先在工具內(nèi)引入vue.js 然后在body里面創(chuàng)建一個div并設(shè)置id,我這里給id命名為\\\"app\\\" 在id命名為\\\"app\\\"的div內(nèi)使用input標(biāo)簽和select標(biāo)簽來設(shè)置運(yùn)算框 然后用 methods方法?computed方法?watch(偵聽器)方法 做出3種不同的加減乘除運(yùn)算 第一種computed方法: 接下來我們在

    2024年02月09日
    瀏覽(40)
  • JAVA中char類型加減乘除運(yùn)算表達(dá)式返回類型

    我們都知道java中,如果char類型和int類型做加減法,那么char類型會被精度提升至int類型然后參與運(yùn)算,返回的也是int類型的數(shù)據(jù)。 那么如果表達(dá)式中參與運(yùn)算的 均為char類型 ,那么表達(dá)式返回的類型是什么呢? 經(jīng)過簡單測試,是 int類型 。 這個問題是在調(diào)用StringBuilder.appen

    2024年02月08日
    瀏覽(27)
  • 【加強(qiáng)版】小學(xué)數(shù)學(xué)出題,加減乘除混合運(yùn)算,支持自定義數(shù)字,一鍵打印

    【加強(qiáng)版】小學(xué)數(shù)學(xué)出題,加減乘除混合運(yùn)算,支持自定義數(shù)字,一鍵打印

    在線預(yù)覽:在線HTML代碼預(yù)覽和運(yùn)行工具 - UU在線工具? ?復(fù)制下面代碼后到該地址預(yù)覽即可 ?注意: 在線預(yù)覽不能打印 。如需打印,在電腦本地上新建文本文檔,粘貼代碼后保存,然后把文件后綴改為.html運(yùn)行,出題點(diǎn)擊打印就可以了 新增功能: 1、支持加減乘除運(yùn)算混合多

    2024年01月17日
    瀏覽(17)
  • linux|shell編程|shell腳本內(nèi)的加減乘除運(yùn)算實(shí)現(xiàn)示例

    shell腳本內(nèi)的加減乘除是由于在編寫kubernetes巡檢腳本的時候,某些部分需要做一點(diǎn)簡單的運(yùn)算,突然發(fā)現(xiàn)我其實(shí)對這些不太熟悉。 因此,查閱了一些資料,現(xiàn)在就加減乘除運(yùn)算在shell腳本內(nèi)如何應(yīng)用做一個簡單的總結(jié),寫的不對的地方請各位輕點(diǎn)噴 首先,我們看一個錯誤的示

    2024年02月17日
    瀏覽(19)
  • 前端vue項(xiàng)目使用Decimal.js做加減乘除求余運(yùn)算

    運(yùn)算結(jié)果是Decimal對象,需要使用.toNumber()轉(zhuǎn)為數(shù)字

    2024年04月13日
    瀏覽(23)
  • 【ARMv8 SIMD和浮點(diǎn)指令編程】浮點(diǎn)加減乘除指令——四則運(yùn)算

    【ARMv8 SIMD和浮點(diǎn)指令編程】浮點(diǎn)加減乘除指令——四則運(yùn)算

    浮點(diǎn)指令有專門的加減乘除四則運(yùn)算指令,比如 FADD、FSUB、FMUL、FDIV 等。 1 FADD (scalar) 浮點(diǎn)加法(標(biāo)量)。該指令將兩個源 SIMDFP 寄存器的浮點(diǎn)值相加,并將結(jié)果寫入目標(biāo) SIMDFP 寄存器。 該指令可以產(chǎn)生浮點(diǎn)異常。根據(jù) FPCR 中的設(shè)置,異常會導(dǎo)致在 FPSR 中設(shè)置標(biāo)志,或者生成同

    2024年02月05日
    瀏覽(27)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包