これは誤差でしょうか?

 投稿者:たろさ  投稿日:2016年12月18日(日)01時14分21秒
  三角関数の数値実験をしていて疑問が出ました。

DECLARE EXTERNAL FUNCTION SIN
DECLARE EXTERNAL FUNCTION cos
DECLARE EXTERNAL FUNCTION TAN
OPTION ARITHMETIC DECIMAL_HIGH
SET BITMAP SIZE 640*2+1,640*2+1 ! x,y軸方向にデフォルトの2倍拡張
SET WINDOW -21,21,-150,150 !x,y
DRAW grid(1,10)
SET LINE COLOR 2

FOR x=-21 TO 21 STEP .1
   LET f=x/PI*x-TAN(x)*x
   PLOT LINES:x,f;
NEXT x

LET x=PI/2
PRINT x/PI*x-TAN(x)*x
PRINT STR$(PI)
PRINT TAN(PI/2)
END

! 1000桁モードで利用する正弦,余弦,正接関数
EXTERNAL FUNCTION sin(x)
DECLARE EXTERNAL FUNCTION cos
OPTION ARITHMETIC DECIMAL_HIGH
IF x<0 THEN
   LET sin=-sin(-x)
ELSEIF x>2*PI THEN
   LET sin=sin(MOD(x,2*PI))
ELSEIF x>PI THEN
   LET sin=-sin(x-PI)
ELSEIF x>PI/2 THEN
   LET sin=sin(PI-x)
ELSEIF x>PI/4 THEN
   LET sin=cos(PI/2-x)
ELSE       ! マクローリン級数による近似
   LET y=x
   LET n=0
   LET t=y
   DO
      LET y0=y
      LET n=n+1
      LET t=-t*x^2/((2*n)*(2*n+1))
      LET y=y+t
   LOOP UNTIL y0=y
   LET sin=y
END IF
END FUNCTION
!
EXTERNAL FUNCTION cos(x)
DECLARE EXTERNAL FUNCTION sin
OPTION ARITHMETIC DECIMAL_HIGH
IF x<0 THEN
   LET cos=cos(-x)
ELSEIF x>2*PI THEN
   LET cos=cos(MOD(x,2*PI))
ELSEIF x>PI THEN
   LET cos=-cos(x-PI)
ELSEIF x>PI/2 THEN
   LET cos=-cos(PI-x)
ELSEIF x>PI/4 THEN
   LET cos=sin(PI/2-x)
ELSE       ! マクローリン級数による近似
   LET y=1
   LET n=0
   LET t=y
   DO
      LET y0=y
      LET n=n+1
      LET t=-t*x^2/((2*n-1)*(2*n))
      LET y=y+t
   LOOP UNTIL y0=y
   LET cos=y
END IF
END FUNCTION
!
EXTERNAL FUNCTION tan(x)
DECLARE EXTERNAL FUNCTION sin,cos
OPTION ARITHMETIC DECIMAL_HIGH
LET tan=sin(x)/cos(x)
END FUNCTION

-----------------------------------------

1.5707963267948966192313216916397514420985846996875529105
1.5707963267948966192313216916397514420985846996876 後で気付いた丸め効果

カシオ 高精度計算サイト50桁の計算結果

tan(1.5707963267948966192313216916397514420985846996876);
tan(pi/2);
sin(1.5707963267948966192313216916397514420985846996876);
cos(1.5707963267948966192313216916397514420985846996876)

x/pi*x-tan(x)*x
x=1.5707963267948966192313216916397514420985846996876
30000000000000000000000000000000000000000000000000



1.5707963267948966192313216916397514420985846996876/pi*1.5707963267948966192313216916397514420985846996876-tan(1.5707963267948966192313216916397514420985846996876)*1.5707963267948966192313216916397514

3.3358 × 10^49

一般的にはtan(pi/2)は計算不能だと思われます。しかし
cos(1.5707963267948966192313216916397514420985846996876)=-5.E-50

十進BASIC 1000桁モードでも同様の計算結果なので、誤差とは言えませんが


x/pi*x-tan(x)*x

pi/2 の計算結果の数値を入力すると各社の計算結果と合わないです。私には理解不能です。

http://blogs.yahoo.co.jp/donald_stinger

 

Re: これは誤差でしょうか?

 投稿者:白石 和夫  投稿日:2016年12月18日(日)11時30分58秒
  > No.4197[元記事へ]

たろささんへのお返事です。

複数個の演算を続けて実行する場合,数学的な性質を利用して短絡評価することはありません。
たとえば,(1/3)*3は決して1になりません。
また,BASICの組み込み関数PIは円周率πの近似値ですが,πと異なる有理数(有限小数)です。
だから,BASICでTAN(PI/2)を計算すると,桁あふれになることはあっても,無効演算にはなりません。



 

Re: これは誤差でしょうか?

 投稿者:たろさ  投稿日:2016年12月18日(日)21時25分19秒
  > No.4199[元記事へ]

白石 和夫さんへのお返事です。

> たろささんへのお返事です。
>
> 複数個の演算を続けて実行する場合,数学的な性質を利用して短絡評価することはありません。
> たとえば,(1/3)*3は決して1になりません。
> また,BASICの組み込み関数PIは円周率πの近似値ですが,πと異なる有理数(有限小数)です。
> だから,BASICでTAN(PI/2)を計算すると,桁あふれになることはあっても,無効演算にはなりません。
>
>

何時もお世話になります。三角関数の多桁演算に慣れてないためか不安になりました。

また、勉強し直して三角関数の多桁演算に慣れたいと思いました。

http://blogs.yahoo.co.jp/donald_stinger

 

戻る