SI 接頭辞に慣れ親しもう

2020年1月15日

SI 接頭辞という言葉は聞き慣れないかもしれませんが、要するにキログラムの「キロ」や、ミリメートルの「ミリ」の部分がそれです。ここでの主張は、「主要な SI 接頭辞は 3 の倍数であることを理解しよう」というものです。

覚えるべきこと

SI 接頭辞はすべて挙げると 20 ほどになりますが、仕様書の中で登場するのはせいぜいこれぐらいです。

接頭辞記号係数
メガM$10^{6}$
キロk$10^{3}$
ミリm$10^{-3}$
マイクロμ$10^{-6}$
ナノn$10^{-9}$

指数がすべて 3 の倍数ですね。3 の倍数であることさえ知っていれば、この表は暗記するまでもありません。

プログラミングへの応用

指数表現の使い方

あなたのお手元にあるプログラムに、こんな記述はありませんか。

#define CPU_CLOCK 200000000  // 200MHz

wait(0.00015);  // 150us

SI 接頭辞が 3 の倍数であるという事実さえ知っていれば、このように書けます。

#define CPU_CLOCK 200.0e+6

wait(150.0e-6);

この表現の素晴らしい点は何といっても、書き間違いや読み間違いを撲滅できることです。プログラムの仕事をしていて、この手の(ゼロが多い少ないの)バグは嫌というほど目にします。また、正しいコードだとしても 0.00015 と書かれて 15 マイクロなのか 150 マイクロなのか一瞬で判別できる人間はいません。技術者のたしなみとして、「3 の倍数」を使いこなしましょう。

基本単位を中心に

秒やヘルツといった物理量を変数として持ち運ぶ場合、その単位は基本単位(つまり SI 接頭辞がつかない単位)にしておくのが、バグのないプログラムを書くコツです。次のコードを見てください。

#define BPS 115200  // 転送レート

// ミリ秒当たりに転送できるビット数を返す
double getBitsFromMilliSec(double millisec)
{
  return BPS * millisec * 1000;
}

このコードにバグがあることにお気づきですか。ここでは 1000 ではなく 0.001 を掛けるのが正解です。このように、SI 接頭辞を含む単位の物理量を掛けたり割ったりすることは、人間を混乱に陥れる傾向があります。また浮動小数点の場合、メガやマイクロで扱ったからといって精度が上がるわけではありません。次のように、基本単位を中心にしましょう。

#define BPS 115200  // 転送レート

// 単位時間当たりに転送できるビット数を返す
double getBitsFromSec(double sec)
{
  return BPS * sec;
}

こうすれば、つまらないバグは減ります。