Humanity

Edit the world by your favorite way

ようやく逆ポーランド計算機できた

いやForthインタプリタだけど。
とりあえず逆ポーランド計算機完成。
C++で作った時は色々すっとばしたので多分1日かかったかかからないか(よく覚えてない)だったと思う。それでもかかりすぎか...へぼい...


それで、0除算した時にエラーチェックしないでおいたら、printfで表示する時「inf」と出た。
なんだこれ?と思ってググったらいくつかのページがひっかかった。


(まずman 3 printfしろというグーグル様からの助言(?))

f, F
double 引き数を丸めて [-]ddd.ddd の形の10進表現に変換する。 小数点の後の桁数は、精度で指定された値となる。 精度が指定されていない場合には 6 として扱われる。 精度として明示的に 0 が指定されたときには、小数点以下は表示されない。 小数点を表示する際には、小数点の前に少なくとも一桁は数字が表示される。


(SUSv2 では、 F は規定されておらず、無限や NaN に関する文字列表現を 行ってもよいことになっている。
C99 標準では、 f 変換では、無限は "[-]inf" か "[-]infinity" と表示し、 NaN は文字列の先頭に `nan' をつけて表示するように規定されている。 F 変換の場合は "[-]INF", "[-]INFINITY", "NAN*" と表示される。)

http://www.linux.or.jp/JM/html/LDP_man-pages/man3/printf.3.html

>0除算して、落ちるプログラムと落ちないプログラムが
>あるのですが、何が違いを生んでいるのでしょうか?

「いつ演算しているか?」と「どうやって演算しているか?」により、複雑に違いを生みます。

・いつ演算しているか?
「定数同士の演算式」は、コンパイラの最適化によって「計算済みの定数」に置き換わる場合があります。

そしてそれは「処理系依存」なので「それをするコンパイラもあれば、それをしないコンパイラもある」のです。

http://ziddy.japan.zdnet.com/qa4624370.html

コンパイラによって違うらしい。うへぇ。
あと上のリンクのeroermineさんの解答で知ったんだけど0除算の時はSIGFPEというシグナルが発生されるらしい。知らなかった!


そういえばシグナル処理してないから受け取った場合にデストラクタ(forth_destruct)が実行されないや。まずいまずい。修正しよう。