はじめに
ちょっと前に「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
で問題ありません。