$0
小数がA個与えられたら、それらがどんな共通する分母の、分数であったかの推定を
するための数値計算プログラム。切り捨てと切り上げも仮定できるが、未指定なら四捨五入を仮定。
出力の読み方:
1列目: N Nは共通する分母を表す
2列目: B Nが分母と仮定した場合の、分子が整数になり得る場合の個数を数える。4通りの色で着色(最大,最大-1,最大-2,それ以外)。
3列目以降:
-D の指定により、各列は与えられた数値を近似する割り算の式である。候補が複数ある場合は最小と最大を;で区切って示す。
-I の指定により、分子になり得る数値の範囲を半区間表記で示す。整数を含む区間の場合は、緑色に着色する。
-Q の指定により、分子となる値を列挙する。-Dや-Iよりも簡便な表示となるが、情報が落ちる場合がある。
使用例:
$0 -g 50 0.25 0.33
# 四捨五入して、0.25 と 0.33 になるような分数で同じ分母を持つものを見つける。
# 出力される各行の最終行が 2 となるものを探せば良い。
オプション:
-c : 入力された数は、切り上げられた数であるとみなす。(ceil)
-f : 入力された数は、切り捨てられた数であると見なす。(floor)
-g num : 何個の出力を得るかの指定。未指定なら20。"Inf" も指定可能。(get, greatest)
-g start,num : コロンを使うと、分母をどの数から始めるかを指定が可能。
-g start,-num : numにマイナスの符号を付加すると、start から 1ずつ減少させながら 最大 num個探索する。
-y EVAL : fit値(整数を区間内に持つ対応する分子の個数)がどの場合に出力するかを指定する。EVALは,や..で指定可能。
-D num : 割り算の数式も出力。numは小数点以下の桁数。四捨五入で出力される。
-I : 分子の数値を知るべくその半区間を表示す。(Interval)
-Q : 分子の候補となる値を全て出す。簡便な表示となる。さらに 2q+1とか5q+3 などと出力(奇数とか1のくらいが3または8などが分かる。)
-2 0 : 二次情報の出力を抑制する。
-5 2 : 既に四捨五入された値の最下位1桁をさらに四捨五入していたことを仮定する。(例. 0.45 → 0.5 → 1)
-5 num : 既に四捨五入された値のさらに何度も最下位1桁を四捨五入したことを仮定。計num回四捨五入をしたと仮定する。
-% : 入力された数はパーセンテージ表記(百分率)であると見なし、内部的には100分の1倍される。
--help : このヘルプを表示する。(ただしPod::PerldocJp を一度インストールすると perldoc $0 でも可能。)
補足 :
* 半区間とは、数学的な区間[x,y)または(x,y]のような、それぞれ、x以上y未満、x超y以下のような数全体を表す。
* 負の数を入力に与えた場合は、その動作によく注意せよ。また 0 や 0.0 を与えた場合も動作に注意。要試行。
開発メモ:
* ただ1個だけの小数点以下8桁の数が渡された場合の良いアルゴリズムを考えたい。
* -Qの指定による出力については、さらに洗練の余地がある。
* 最大公約数を計算するために、普段使わない Math::BigInt を用いている。
* 入力の0に対して、-0.000が発生する謎
* 同じ数値が与えられたときに different piece で fit も反映させたい。 -s 0 でそれを解除したい。
* 偶数丸め ( JIS Z 8401 と ISO 31-0 ) に対応したい。-50を割り当てたい。しかし、大幅な改装が必要。
* 各分母に対して、対数尤度を表示する -Lのオプションを作りたい。