分数を小数に戻す


J言語では有理数をあつかえてとても気持ちがいいのですが、このときx:(エックスコロン、extended precision)という動詞を使います。

   2 % 3
0.666667
   x: 2 % 3
2r3

ここで2r3とかが分数(fraction)です。分数のままで普通の計算ができます。自動的に約分されて便利です。

   4r5 + 2r3
22r15
   22r15 - 5r12
21r20

とは言え、逆に分数を小数にしたいときもあって、どうやるのか不思議に思っていました。

   21r20
21r20
   21 % 20
1.05

というようrに%で割れば、デフォルトは小数なので小数(decimal)になりますが、専用の動詞はなさそうです。そんな風に考えていて、思いついたのが関数の逆関数を作る副詞が使えないかということです。^:_1(キャレットコロンマイナスいち)というのを動詞の後に付けるとその前の動詞(関数)の逆関数になる。マイナス1のところをプラスの数字、2とか3とかにするとその前の動詞を何度も繰り返して作用させるので^:(キャレットコロン)はパワー(自乗)と呼ばれます。やってみたところうまく行きました。

   x:^:_1 (2r3)
0.666667
   (x:^:_1) 2r3
0.666667
   x:^:_1 2r3
domain error
x:^:_1 2r3
かっこでくくらないと引数の区別がつかないのでエラーになります。 さて、始めから調べればよかったのですが、ボキャブラリーでx:(エックスコロン)を調べると、有理数を有限の浮動小数にするにはx:^:_1を使うとかいてありました。二項動詞として左側引数に_1(マイナスいち)を使っても同じことができるとのことです。
   _1 x: 2r3
0.666667
   2 x: 2r3
2 3
二項動詞として左側引数に2を使った場合は、分子と分母を入れたベクトルを返すようです。 以上