• 工学表示3原則

7セグメントLEDなどを使った1970年台の電卓では、数値しか表示できなかった。このとき、指数を使う浮動小数点表示には、いくつかの表示方法が選択できた。そのうちの1つが「工学浮動小数点表示」である。10のべき乗を指数に使うことは、通常の浮動小数点表示と同じだが、この指数を3の倍数になるように仮数部を調整する。これにより、数値をSI接頭辞付きに変換しやすくなる。

SI接頭辞とは、いわゆるキロとかミリなどの数値のべき乗を文字で表すもの。慣れた人なら、数値のおおよそのスケールを把握でき、2つの数値の比較も簡単になる。工学、理学系では、多くの場合、SI接頭辞付きで数値を記述することが多く、パソコンが普及するまでは電卓で工学浮動小数点表示を使うことが多かった。

最近の電卓はグラフ表示もできるドットマトリックス液晶を装備しており、工学浮動小数点表示としてSI接頭辞を表示させることも可能になった。このため、工学浮動小数点表示を知らない方も多いだろう。

bashやPowerShellなどのシェル、コマンドラインインタプリタでは、ちょっとした計算が行えるものの、SI接頭辞や工学浮動小数点表示を行う機能がない。しかし、Linuxの標準ツールには、numfmtコマンドがあり、数値をSI接頭辞で表示させることができる(写真01)。運のいいことにこのnumfmtコマンドは、以前紹介したCoreUtilに含まれており、Windows 11でも利用できる。

  • 写真01: Linux、WindowsのCoreUtilに含まれているnumfmtコマンドを使うと、正の整数のべき乗となるSI接頭辞を付けられる。formatオプションで仮数部の表示方法を変更可能

    写真01: Linux、WindowsのCoreUtilに含まれているnumfmtコマンドを使うと、正の整数のべき乗となるSI接頭辞を付けられる。formatオプションで仮数部の表示方法を変更可能

・窓辺の小石 第273回 Windowsの知らない言葉
https://news.mynavi.jp/article/pebbleinthe_window-273/

しかし、残念なことにこのnumfmtは、正の指数にしか対応しておらず、1以下の負の指数に対応したSI接頭辞は変換ができない。

もう1つの方法としては、計算して工学浮動小数点表示を行う方法がある。結局、指数部を3の倍数になるように仮数部を調整するだけで、それほど難しいものでもない。仮数部と指数部を計算したら、電卓風に数値のみで表示してもよいし、指数部をSI接頭辞に変換してもいい。指数部の計算は、図01のように行う。floor関数(床関数)は、小数部を切り捨てる関数で、ExcelではINT関数に相当する。

  • 図01: 対数関数を使って、3の倍数に合わせた指数部を計算し、これを使って仮数部を計算する。これを使えば工学浮動小数点表示が可能になる

    図01: 対数関数を使って、3の倍数に合わせた指数部を計算し、これを使って仮数部を計算する。これを使えば工学浮動小数点表示が可能になる

・床関数と天井関数 - Wikipedia

ここで使ったlog関数(対数関数)は、底が10になっているもの。

・対数 - Wikipedia

この数式で、3の倍数となる指数を得られたら、この指数を使って、仮数部を計算できる。

言語によっては、log関数の底が自然対数の底(e)に固定されているものがある。この場合、指数関数の性質を使って底を変換する。この式を使えば、log関数の底が固定されていても、任意の底を使った対数計算ができる。

指数部をSI接頭辞に変換すること自体は、簡単だが、配列にSI接頭辞(正負、それぞれ最低10個で20個)を記録しておく必要があり、ワンライナーにするよりは、関数などに定義して繰り返し使うほうがよい。

最後に、PowerShellの場合を示しておく。PowerShellでは、床関数や対数関数は、mathクラスのものを利用する。このため、記述がちょっと面倒だが、原理は、上で説明したものと同じである。


# $Xに工学浮動数点表示をしたい数値を入れる
 $E=[math]::floor([math]::log($X)/[math]::log(10)/3)*3; 
 $S=$X/[math]::pow(10,$E)

ここで、$Xには、工学浮動小数点表示にしたい数が入っている。$Eは3の倍数にした指数、$Sは、そのときの仮数部である。

今回のタイトルネタは、アシモフの有名な「ロボット工学3原則」である。現在では「われはロボット」(邦訳早川書房、東京創元社ほか。Isaac Asimov,"I, Robot" ,1950年)という短編集で紹介されている。科学的に突き詰めていくと、これで正しいのか? という話になってしまうが、「原則」を定義して、それを「枠」として作品を作る。このスタイルに挑んだ作品は多いが、これを越えるものはいまだに存在しない。