対数表示した軸の目盛り数字には"10n"(nは整数)という形で表現される数値を用いているが、 この10の肩に乗る数字を決定する処理にエラーがあった。 浮動小数点数による計算では、入力値dについて a=log(d)/log(10) という値を求めて、この値を int型にキャストする処理によって n=(int)a という値を得ている。
しかし、浮動小数点数の丸め誤差により、この方法では正しい値が得られない場合がある。 例えば、目盛りの数値としてd=1000という値が入力された場合、数学的にはnは明らかに3に等しい のだが、上記の計算でaとして得られる値は2.999...というもので、これをキャストして得られる値は n=2になり、数値1000に対応する目盛りとして"102"という誤った文字列が用いられてしまう。
そこで、得られたnの値に1を足した値の10のべき乗、すなわち 10(n+1) の値を求めて、 その値が入力値dと浮動小数点数として一致している場合には、nを1だけインクリメントするように 修正した。 この修正によって、これまでエラーを起こしていた数値も含めて、対数表示した軸の目盛り数字には エラーが発生しなくなったことを確認した。
※JREの1.5以降ではMathクラスのlog10(double)というメソッドが利用可能で、この場合には 入力値1000に対して正しく3という値を返してくれるのだが、JRE1.4以上に対応しているとする Samurai Graph では、現時点では利用できない。
バージョン 2.0.0 のリリースに伴い close します。
具体的には、以下のデータを Scalar-XY でグラフ化して
X軸を対数表示したときに、10^3 となるべき目盛り数字が
10^2 と表示される。
100,100
500,500
1000,1000
5000,5000
10000,10000