表示形式
rpnは結果を数値で返します。その数値は整数や小数を伴った実数、非常に大きな数や小さな数といろいろな種類があります。rpnは数値の違いに合わせて見やすいように自動的に調整しますが、自分で好みの表示形式にすることもできます。
以下はrpnで表示することができる6つの形式です。それぞれ名称と説明を示します。
通常形式 |
何も指定しない状態の数値表示形式です。混合形式と同じです。
|
---|---|
整数形式 |
小数のない整数のみの表示形式です。
|
固定長形式 |
表示桁数を固定にした表示形式です。
|
指数形式(科学表記) |
有効桁数が6~7桁+指数の表示形式です。とても大きな数値や小さな数値を表現するのに適しています。
|
混合方式 |
大きな数値や小さな数値では指数形式を使い、それ以外は短く数値表現する形式です。
|
桁区切方式 |
3桁区切りでカンマを挿入した形式です。小数点は無視されます。金額表示に適しています。
|
表示オプションの書き方
表示形式の変更はオプションで行います。オプションは"-"とアルファベットの記号を繋げたもので、-rや-fdなどがあります。rpnの後に逆ポーランドの式を書くのは今までどおりですが、その後にオプションを加えることで、計算結果の表示形式を変えることができます。
>rpn 1.1 2.2 + -fd
① ②
※1.1と2.2を足した答えを整数形式で表示する。
①の「1.1 2.2 +」がrpn式で、②の-fdが表示形式を変えるオプションです。次に数値の1234.5678をそれぞれの表示形式に変えるオプションを使った場合を示します。
>rpn 1234.5678
1234.57
整数形式
>rpn 1234.5678 -fd
1234
固定形式
>rpn 1234.5678 -ff
1234.567800
指数形式
>rpn 1234.5678 -fe
1.234568e+03
混合形式
>rpn 1234.5678 -fg
1234.57
桁区切形式
>rpn 1234.5678 -fc
1,234
表示形式の大体のイメージは掴めたでしょうか。日常使うほとんどの場面では通常形式(混合形式)で問題はないと思いますが、お金の計算は3桁区切りが分かりやすいですし、科学技術計算では指数形式の方が統一されていて分かりやすいこともあります。
リダイレクトで大量データを一気に
このようにオプションで指定することにより、好みの形式で答えを表示できますが、大量の数値の表示形式を変更したいときにはちょっと面倒です。
具体的に例を示して説明します。以下は玄米100gあたりの成分表です。
============= ====== ============= ====== ============= ======
たんぱく質 6800 マグネシウム 110 ビタミンB1 0.41
脂質 2700 リン 290 ビタミンB2 0.04
炭水化物 73800 鉄 2.1 ナイアシン 6.3
灰分 1200 亜鉛 1.8 ビタミンB6 0.45
ナトリウム 1 銅 0.27 葉酸 0.0027
カリウム 230 マンガン 2.05 パントテン酸 1.36
カルシウム 9 ビタミンE 1.3 食物繊維 3700
出展:文部科学省「日本食品標準成分表」
このうちのmg(ミリグラム)だけを集めたファイルがdata.txtにあるとします。
2700
73800
1200
1
230
9
110
290
2.1
1.8
0.27
2.05
1.3
0.41
0.04
6.3
0.45
0.0027
1.36
3700
以上がその内容なのですが、一つずつrpnでオプション指定しながらの変換は日が暮れてしまいます。このようにファイルにデータが既に格納されている場合はリダイレクトの機能を使うと一発で変換できます。
リダイレクトについては、rpn基礎のプログラムで計算しようとdos入門のリダイレクトに詳しい説明があります。
では、上記のデータを整数形式に変換してみましょう。次がそのrpn式です。
6800
2700
73800
1200
1
230
9
110
290
2
1
0
2
1
0
0
6
0
0
1
3700
全ての数値が整数でしか表示されていませんね。小数がきれいにカットされています。このようにファイルに数値を格納しておいて、リダイレクトでrpnにデータを渡すことで表示形式を一気に変えることができます。
以下の図で説明すると、まずdata.txtのデータがリダイレクトでrpnに渡されて整数変換されます。変換されたデータはそのまま画面に表示されるという仕組みです。
| | (data.txtから取り出して…)
v |
>rpn -fd <data.txt
|
+----------------> (画面へ表示)
(整数に変換して)
同じようにして、表示オプションを使って変換した結果を一覧にして示します。
6800 6800 6800.000000 6.800000e+03 6800 6,800
2700 2700 2700.000000 2.700000e+03 2700 2,700
73800 73800 73800.000000 7.380000e+04 73800 73,800
1200 1200 1200.000000 1.200000e+03 1200 1,200
1 1 1.000000 1.000000e+00 1 1
230 230 230.000000 2.300000e+02 230 230
9 9 9.000000 9.000000e+00 9 9
110 110 110.000000 1.100000e+02 110 110
290 290 290.000000 2.900000e+02 290 290
2.1 2 2.100000 2.100000e+00 2.1 2
1.8 1 1.800000 1.800000e+00 1.8 1
0.27 0 0.270000 2.700000e-01 0.27 0
2.05 2 2.050000 2.050000e+00 2.05 2
1.3 1 1.300000 1.300000e+00 1.3 1
0.41 0 0.410000 4.100000e-01 0.41 0
0.04 0 0.040000 4.000000e-02 0.04 0
6.3 6 6.300000 6.300000e+00 6.3 6
0.45 0 0.450000 4.500000e-01 0.45 0
0.0027 0 0.002700 2.700000e-03 0.0027 0
1.36 1 1.360000 1.360000e+00 1.36 1
3700 3700 3700.000000 3.700000e+03 3700 3,700
ちなみに宇宙が誕生してからの年数、一年のうちで交通事故で死ぬ確率、宝くじで1等が当たる確率は以下になります。
1.37e+10
>rpn 160000 n
6.25e-06
>rpn 10000000 n
1e-07
全て指数形式になっていますね。それくらいにとても大きい数値かとても小さい数値ということですね。
8桁日付の扱い
最後に応用として、8桁の日付の扱いについて説明します。カレンダー・システムパッケージのrpnプログラムなどが8桁の日付を処理しますが、8桁の日付をそのままrpnで出力させると日の情報が失われてしまいます。
2009年12月31日を数値の20091231として表現しているとしましょう。この数値をrpnで扱うと以下のように情報が欠損します。
2.00912e+07
2.00912e+07は2.00912×10の7乗という指数形式(科学表記)になっていますので、有効な桁は2.00912です。なんと日の情報が欠けてしまいます。そこで、日付を扱うときは-fdオプションをつけることになります。
20091231
年月日が情報欠損なく表示されていますね。