#[no_std] で数学関連の機能を利用する
平方根の計算や数値の指数関数の計算といった数学関連の機能を使いたく、完全な標準ライブラリが利用できる場合、コードは次のようになります。
//! 標準サポートが利用可能な、いくつかの数学関数
fn main() {
let float: f32 = 4.82832;
let floored_float = float.floor();
let sqrt_of_four = floored_float.sqrt();
let sinus_of_four = floored_float.sin();
let exponential_of_four = floored_float.exp();
println!("テスト用の浮動小数点数 {} を {} に切り捨てました", float, floored_float);
println!("{} の平方根は {} です", floored_float, sqrt_of_four);
println!("4 の正弦は {} です", sinus_of_four);
println!(
"4 の e を底とする指数関数の値は {} です",
exponential_of_four
)
}
標準ライブラリのサポートがない場合、これらの関数は利用できません。
代わりに libm のような外部クレートを使用できます。その場合、コード例は次のようになります。
#![no_main]
#![no_std]
use panic_halt as _;
use cortex_m_rt::entry;
use cortex_m_semihosting::{debug, hprintln};
use libm::{exp, floorf, sin, sqrtf};
#[entry]
fn main() -> ! {
let float = 4.82832;
let floored_float = floorf(float);
let sqrt_of_four = sqrtf(floored_float);
let sinus_of_four = sin(floored_float.into());
let exponential_of_four = exp(floored_float.into());
hprintln!("テスト用の浮動小数点数 {} を {} に切り捨てました", float, floored_float).unwrap();
hprintln!("{} の平方根は {} です", floored_float, sqrt_of_four).unwrap();
hprintln!("4 の正弦は {} です", sinus_of_four).unwrap();
hprintln!(
"4 の e を底とする指数関数の値は {} です",
exponential_of_four
)
.unwrap();
// QEMU を終了する
// 注: これはハードウェア上で実行しないでください。OpenOCD の状態を破損する可能性があります
// debug::exit(debug::EXIT_SUCCESS);
loop {}
}
MCU 上で DSP 信号処理や高度な線形代数のような、より複雑な演算を行う必要がある場合は、次のクレートが役立つかもしれません