From: gotoken@... (GOTO Kentaro) Date: 1999-02-24T16:53:07+09:00 Subject: [ruby-dev:5595] Re: a genericity ごとけんです In message "[ruby-dev:5575] Re: a genericity" on 99/02/24, "豊福" writes: > 豊福@パパイヤです。 > > float.prec(Rational) の意義がまだわかりません。 >あるべきでないとまで考えてるわけじゃないのですが >どういうときに使うのかなあと。 基本的には,0.5 ==> 1/2 というような変換を行うためです. そのこころは,計測機などから得た生データを初期値とする 演算の精度を自分で制御することが一つの具体例で,一般に 手持ちの float を種に任意の精度の数が扱えるようにする 簡便な方法と考えています. > prec(Rational) はまだよいのですが例えば分母が >奇数の有理数のクラス RationaOddDenomi を作った >としたら > RationaOddDenomi < Rational < Float >ですね。 直観的には最初の不等号も理解できますが,分母の選び方が 明示されないと,RationalOddDenomi の精度は確定しない 気がします. 石塚さんの指摘に誘われ Mathematica 2 のマニュアルを友人 からかりました.近いうちに我々の関心のあるところをまとめ ここに投稿するつもりですが,この件に関していうと Mathematica には Rationalize という関数があり, 省略可能な第2引数で許容誤差を指定できます. Rationalize[0.1] ==> 1/10 Rationalize[Pi] ==> Pi (円周率πに充分近い有理数は無い) Rationalize[Pi, 1/9] ==> 22/7 Rationalize[Pi, 10^-10] ==> 21053343141/6701487259 ちなみに Precision[0.1] ==> 16 Precision[Pi] ==> Infinity Precision[1] ==> Infinity Precision[0.12345678901234567890] ==> 19 Mathematica における精度とは,10進展開において最上位桁から みて連続した正確な桁の長さのことで,Precision はこの意味の 精度を返します.小数点の前後を区別するために,Accuracy と いう関数もあり,これは小数点以下の有効桁数を返します. また,Precision/Accuracy に数でないオブジェクトを与えたとき はその中に現れる数の有効桁数の最小値を返し,数が含まれない ときは,Infinity を返します.これは,僕の精度の定義よりも 浮動小数点数に関する考慮が現実的(物理屋的??)です. # Wolframが素粒子で学位を取っているためか?? SetPrecision[x,n] というのもあり,必要に応じて x の2進表現 に0を充填してトータルで精度を10進 n 桁にすることもできます. SetAccuracy も同様です. SetPrecision[0.1,100] ==> 0.100000000000000005551115\ 12312578270211815834045410156250000000000000000000\ 00000000000000000000000000 Precition[SetPrecision[0.1,100]] ==> 100 なお16桁を越える小数リテラルを与えたときは自動的に必要な 精度を与えます.16桁以下のときは機械精度が割り振られます. Mathematica において数同士の演算における精度の扱いはやや 複雑で,一旦充分な高精度で行って,その後オペランドの精度 と比較し精度を確定しているようです.ただし,オペランドに 機械精度がふくまれるときは全てを機械精度で行います. Ruby の String における taint に近い考え方です. 例: Precision[0.12345678901234567890] ==> 19 Precision[Pi + 0.12345678901234567890] ==> 21 Precision[Pi + 0.1] ==> 16 なかなかに考えられた定義だと思います. -- gotoken