LoginSignup
9
4

More than 3 years have passed since last update.

Rustの「Ord」、「PartialOrd」とは(初歩)

Posted at

おことわり

筆者は数学的知見に乏しく、専門的な解説としては不備があります。
数学的解説としてではなく、意味の把握程度に目を通して頂ければ幸いです

概要

Ord全順序集合(Total Order)、
PartialOrd半順序集合(Partial Order)を指しています。

数学的な証明は置いといて、ざっくり何が違うのかと言うと

・任意の要素 全て比較可能 であるか(Ord)
比較不可能か (Partial_Ord)

といった違いが存在します
以下で実際のソースを見てみましょう

Ordトレイトを実装している i32
PartialOrdトレイトしか実装されていない f64 にて例を示してみます。

// i32の場合
fn main(){
    let val:i32 = 15;
    let v = vec![15,32,22,35,92,0];

    //どんな要素を選んでも比較可能
    println!("{},{},{}",val<=15,val>=15,val<=std::i32::MAX);

    //Ordが実装されているので、Iterator::max()等も使える
    println!("{}",v.iter().max().unwrap());

}

一方、f64になると

fn main(){
    let val:f64 = 1.2;
    let v:Vec<f64> = vec![15.0,32.0,22.0,35.0,92.0,0.0];

    //表現可能な数値は比較可能だが…
    println!("{},{},{}",val<=5.3,val>=2.4,val<=std::f64::MAX);

    //NANとの正しい比較が行えない
    println!("{},{},{}",val<=std::f64::NAN,val>=std::f64::NAN,val==std::f64::NAN);

    //Ordが実装されていないので、Iterator::max()等は使えない
    //println!("{}",v.iter().max().unwrap());

}

となり、f64ではNANとの正しい比較が不可能なためOrdの要件を満たせなくなります。
このように、比較不可能な要素が存在するorしないが
PartialOrdOrdの主な違いです

最後に

(大切な事なので)もう一度言うと
Ord は、どのような要素を選んでも 比較可能 な型に
PartialOrdは、比較不可能 な要素が存在する型に
実装されています

参考

Rustで競技プログラミング スターターキット(@hatoo@githubさん)
 →PartialOrdの解説と、NANを受け取った時にパニックを起こすOrdトレイトラッパの実装が紹介されています。

Rustでf32やf64の配列の最大値を得る方法(@lo48576さん)
 →f32/64配列の最大値を取得する方法が解説されています。

どちらの記事も非常に参考になる内容でしたので、是非一読されることを
オススメします

9
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
4