【概要】
sqrt() 関数は、与えられた数値の平方根を計算する標準的な数学関数である。Arduino環境において、この関数はC/C++標準ライブラリの <math.h> を介して提供される。物理演算、信号処理、幾何計算など、平方根を必要とするあらゆる数理処理の基礎として利用される。
【仕様】
- 引数:
double型(浮動小数点数) - 戻り値:
double型(平方根の値) - データ型: Arduinoの多くのボードにおいて、
float型およびdouble型の入力を受け付ける。 - 初期状態/前提条件: 引数はx ≥ 0(x は0以上)である必要がある。負の値を入力した場合、標準的な動作として
NaN(Not a Number) を返す。
【技術的特徴】
- ハードウェアによる実装の差異:
- FPU搭載プロセッサ(例: STM32F4, Teensy 4.0など): 浮動小数点演算ユニット(FPU)により、ハードウェアレベルで高速に実行される。
- FPU非搭載プロセッサ(例: Arduino Uno/Nano, ESP32の一部): ソフトウェアによる近似アルゴリズム(Newton-Raphson法や、より高度な多項式近似)を用いて計算されるため、演算コストが高い。
- 精度: 実行環境の浮動小数点精度(通常は32ビットまたは64ビット)に準拠する。
- 計算量: 線形演算(加算・乗算)と比較して計算コストが高く、ループ内や高頻度の割り込み処理内での使用には注意を要する。
【注意点】
- 処理負荷(オーバーヘッド):
8ビットマイコン(ATmega328P等)においてsqrt()は非常に重い演算である。リアルタイム性が要求される制御ループ(例: 数kHzのサンプリング周期)内で使用する場合、処理時間が予測時間を超過する可能性がある。 - 負の入力への対応:
センサーデータのノイズなどで負の値が入る可能性がある場合、sqrt()を呼び出す前にabs()関数で絶対値を取るか、入力値のバリデーションを行うことが必須である。 - ルックアップテーブル(LUT)の検討:
精度よりも速度を優先する場合、あるいは計算負荷を抑えたい場合は、あらかじめ計算した値をテーブルとして保持(LUT)し、線形補間を用いて近似値を求める手法が推奨される。 - 型変換のコスト:
float型を渡した際に、内部的にdouble型へキャストされて計算される挙動があるため、極端な精度を求める場合は型の一貫性に留意すること。
【サンプルコード】
/* 2点間のユークリッド距離を計算する例 */
void setup() {
Serial.begin(9600);
}
void loop() {
float x1 = 1.0, y1 = 2.0;
float x2 = 4.0, y2 = 6.0;
// 距離の公式: d = sqrt((x2-x1)^2 + (y2-y1)^2)
float dx = x2 - x1;
float dy = y2 - y1;
float distance = sqrt(dx*dx + dy*dy);
Serial.print("Distance: ");
Serial.println(distance);
delay(2000);
}
【活用例】
- 距離・位置計算: GPS座標や超音波センサーのデータを用いた、2点間の直線距離の算出。
- 信号処理(RMS): 音響信号や電圧データの二乗平均平方根(Root Mean Square)を求める計算。
- 物理シミュレーション: 加速度から速度へ、または速度から変位への変換における動径の計算や、円運動の解析。
- ベクトル演算: ベクトルの大きさを算出する際の規格化(Normalization)処理。


コメント