LoginSignup
2
2

More than 3 years have passed since last update.

Rustのsoftfloatラッパーライブラリを作った

Posted at

はじめに

ちょっと前に「Rustのsoftfloatライブラリ比較」という記事を書きました。その時は「最も高速なsoftfloat-sysにラッパーライブラリを作って使うといいでしょう」という他人事的な結論としましたが、自分で使っていて辛くなってきたのでちゃんとした?ラッパーライブラリを作りました。

softfloat-wrapper

リポジトリは以下になります。

使い方

浮動小数点数型としてF16, F32, F64, F128を提供します。
例えば16bitのビットパターンからF16を構成して加算する例は以下のようになります。当然丸めモードを指定可能です。

let a = 0x1234;
let b = 0x1479;

let a = F16::from_bits(a);
let b = F16::from_bits(b);
let d = a.add(b, RoundingMode::TiesToEven);

また、浮動小数点演算を行える型を表すFloatトレイトを定義しており、全ての浮動小数点数型はこれを実装しています。
そのため以下のようなジェネリックな関数定義が可能です。

fn rsqrt<T: Float>(x: T) -> T {
    let ret = x.sqrt(RoundingMode::TiesToEven);
    let one = T::from_u8(1, RoundingMode::TiesToEven);
    one.div(ret, RoundingMode::TiesToEven)
}

let a = F16::from_bits(0x1234);
let a = rsqrt(a);
let a = F32::from_bits(0x12345678);
let a = rsqrt(a);

また、各浮動小数点数型はCopyとしているのでプリミティブ型と同じような感覚で扱うことができます。
実際のところ内部データは単なるu16, u32, u64, u128なのでCopyで問題ありません。

2
2
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
2
2