√(ルート)のなかの数字

 投稿者:LHSメール  投稿日:2011年 9月 2日(金)09時31分27秒
  いつもお世話になっています。
SHARPのポケコンを使っていますが最近のものはDISKが使えず不便で
十進BASICを見つけましたので使っています。
BCDですので計算精度がよく大変気にいっています。

ところで
√(ルート)のなかの数字の件ですが

-2^(1/2)がエラーになることはわかりますが
-2^(1/3)がエラーになることは解せません。
SHARPのPC-G850Sではエラーにならないです。
a^(1/3)のような式の場合aの正負の判別をしてそれによって計算を変えなくてはなりません。
if   else   end if を使わなくてはならず、手間で、面倒なのですが
改善はしたほうがいいではないでしょうか?
皆さんにご意見を伺ったらどうでしょうか?
 

Re: √(ルート)のなかの数字

 投稿者:山中和義  投稿日:2011年 9月 2日(金)11時30分36秒
  > No.1659[元記事へ]

LHSさんへのお返事です。

> √(ルート)のなかの数字の件ですが
>
> -2^(1/2)がエラーになることはわかりますが
> -2^(1/3)がエラーになることは解せません。
> SHARPのPC-G850Sではエラーにならないです。

次はFullBASICの仕様です。
べき乗の評価
・負数の非整数乗は、3002の続行不能の例外状態
・ゼロの負数乗は、3003の続行不能の例外状態
・0^0は1とする。
・-A^Bは、-(A^B)と解釈する。
・A^B^Cは、(A^B)^Cと解釈する。

PRINT (-2)^(1/3)という記述ができませんが、
自前のべき乗関数、たとえばpower(x,p,q)、x^(p/q)をつくり
 PRINT power(-2,1,3)
 END
とすればよいと思います。
 

Re: √(ルート)のなかの数字

 投稿者:白石和夫  投稿日:2011年 9月 3日(土)08時31分35秒
  > No.1659[元記事へ]

a^bは2変数関数です。
bが有理数の場合だけ定義すればよいものとすれば,bを既約分数で表して分母が奇数の場合だけaが負数であることを許す定義も可能ですが,そこから展開される数学は奇怪なものとなります。
bを実数の範囲にまで拡張しようと考えると,a^b=exp(b*log(a))で定義するのが自然ですが,aが負数のときのlog(a)は虚数で,多値となり,BASICの組込関数として用意しようとする場合にはどれを関数値として定めるべきか悩みます。
十進BASICの複素数モードで次のプログラムの10行に示すようなpower関数を定義してみると,おそらくお望みの答えとは違う値が得られると思います。
10 OPTION ARITHMETIC complex
20 DEF power(a,b)=EXP(b*LOG(a))
30 PRINT power(2,5)
40 PRINT power(-2,5)
50 PRINT power(8,1/3)
60 PRINT power(-8,1/3)
70 END

2変数関数のa^bでなく,1変数関数の立方根関数がほしいのであれば,近似値でよければ,
10 DEF CubRoot(x)=SGN(x)*ABS(x)^(1/3)
20 PRINT CubRoot(8),CubRoot(-8)
30 PRINT CubRoot(27),CubRoot(-27)
40 END
で求められます。(誤差が生じる理由は,以下を参照)


正確な値を求めたいのであれば,ニュートン法を利用して立方根関数を定義してください。
 

Re: √(ルート)のなかの数字

 投稿者:白石和夫  投稿日:2011年 9月 4日(日)11時27分30秒
  > No.1661[元記事へ]

補足です。

BASICのa^bの評価において,bを既約分数で表して分母が奇数の場合にaが負数であることを許すように拡張することは可能ですが,非現実的です。
なぜかというと,すべての数値を2進浮動小数点数として扱う場合には,分数の計算結果を既約分数に表すと分母は必ず偶数になります。。
十進BASICのように数値を10進浮動小数点数で表す場合でも,1/3の計算結果を有限桁で近似した結果を既約分数に直すと,分母は10の倍数になるので偶数です。だから,実際に意味を持つのは,指数が1/5とか1/25,1/125のような場合のみです。
ただし,十進BASICには有理数モードがありますが,有理数のみを扱う場合には,結果が有理数になる場合にはべき指数に分数を許すようにすることも理論的には可能です。

その意味で,SHARPのPC-G850Sはどういう計算をしているのか興味があります。^(1/3)と書くと3乗根の計算を行うような構文解析を行っているのでしょうか。もしそうだとすると,
10 LET A=-2
20 LET B=1/3
30 PRINT A^B
40 END

10 LET A=-2
30 PRINT A^(1/3)
40 END
とで実行結果が異なるはずです。
あるいは,有理数演算を行っているのでしょうか。まさか,3進小数ではないと思いますが。




 

戻る