Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

COS値から角度を求める近似式

485 views
Skip to first unread message

Shiro KONO

unread,
Apr 2, 1999, 3:00:00 AM4/2/99
to
0-1の範囲のコサイン値からその角度を求めたいのですが、
加減乗除のみで求められる「近似式」をどなたかご存じない
でしょうか?

使用中の開発言語環境でルートを使用する事ができません。
求める値(角度なら0-90度)の精度はせいぜい0.1度位
までで充分です(何なら1度単位くらいまで)。

ご存じの方よろしくお願いします。

--
Shiro KONO e-mail: ai...@mxt.mesh.ne.jp


griffon

unread,
Apr 2, 1999, 3:00:00 AM4/2/99
to
On 1999/04/02 23:31:29, Shiro KONO wrote
in COS値から角度を求める近似式<7e2k87$kvg$5...@meshsv230.tk.mesh.ad.jp>:

cos x(0≦x≦π)の逆関数をCos(-1)x と書くことにすれば、

d(Cos(-1)x)/dx = -1/(1-x^2)^(1/2)
= -1 -x^2/2 -3x^4/8 -5x^6/16 -....
両辺積分して、
Cos(-1)x = -x -x^3/6 -3x^5/40 -5x^7/112 -.... +C

Cos(-1)0 = π/2
なので、C=π/2

でいかがでしょう?

* 凪 ※ _______________________
* (∵) * ぐりふぉん
* `( : )' * mailto: x...@104.net
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄


YOSIDA Takayuki

unread,
Apr 3, 1999, 3:00:00 AM4/3/99
to
吉田@parkcityと申します。

Message-ID: <7e2k87$kvg$5...@meshsv230.tk.mesh.ad.jp>

> 求める値(角度なら0-90度)の精度はせいぜい0.1度位
> までで充分です(何なら1度単位くらいまで)。

# あまりmath的でない解決の気もしますが、
cos0.05度からcos89.95度まで900個位を、あらかじめ計算した
テーブルを用意するのが楽かもしれません。
---


TANAKA Jiro

unread,
Apr 3, 1999, 3:00:00 AM4/3/99
to
In article <7e2k87$kvg$5...@meshsv230.tk.mesh.ad.jp>,
"Shiro KONO" <ai...@mxt.mesh.ne.jp> wrote:

:0-1の範囲のコサイン値からその角度を求めたいのですが、
:加減乗除のみで求められる「近似式」をどなたかご存じない
:でしょうか?
:求める値(角度なら0-90度)の精度はせいぜい0.1度位
:までで充分です(何なら1度単位くらいまで)。

必殺「数表」(テーブル引き)ではダメでしょうか?

#16bit固定小数点の表で、180Byte+プログラム R.田中二郎
--
<A HREF="http://www.nerimadors.or.jp/~jiro/">Anime & Comics</A>
[ ji...@nerimadors.or.jp ] [ ji...@math.keio.ac.jp ] [ JR3JXE/1 ]

KGK == Keiji KOSAKA

unread,
Apr 3, 1999, 3:00:00 AM4/3/99
to
! "<7e3nuk$tas$1...@wa1.seikyou.ne.jp>" という記事で
! Fri, 02 Apr 1999 23:54:39 GMT 頃に griffon さん は言ったとさ:

> cos x(0≦x≦π)の逆関数をCos(-1)x と書くことにすれば、

> d(Cos(-1)x)/dx = -1/(1-x^2)^(1/2)
> = -1 -x^2/2 -3x^4/8 -5x^6/16 -....

べき展開よりはチェビシェフ補間あたりの方が安定して求められる気がする。
# arccos だからチェビシェフが楽かなあ、やはり。
--
KGKGKGKGKGKGKGKGKGKGKGKGKGKGKGKGKGKGKGKGKGKGKGKGKGKGKGKGKGKGKGKGKGKGKGK
KGK KGK (life name: Keiji KOSAKA), Dept. of Phys., Okayama Univ. KGK
KGK mailto:k...@mp.okayama-u.ac.jp http://mp.okayama-u.ac.jp/~kgk/ KGK
KGKGKGKGKGKGKGKGKGKGKGKGKGKGKGKGKGKGKGKGKGKGKGKGKGKGKGKGKGKGKGKGKGKGKGK

Kobayashi Kenta

unread,
Apr 3, 1999, 3:00:00 AM4/3/99
to

Shiro KONO wrote in message <7e2k87$kvg$5...@meshsv230.tk.mesh.ad.jp>...

>0-1の範囲のコサイン値からその角度を求めたいのですが、
>加減乗除のみで求められる「近似式」をどなたかご存じない
>でしょうか?
>
>使用中の開発言語環境でルートを使用する事ができません。

>求める値(角度なら0-90度)の精度はせいぜい0.1度位
>までで充分です(何なら1度単位くらいまで)。


とりあえず作ってみたら出来たので書いておきます。
冪級数で初期値を求めてニュートン法で計算します。
C言語で書きましたが、不都合でしたらおっしゃって下さい。
素で書き直します。(場合分けが面倒ですが)
戻り値の単位はラジアンです。度に換算して±0.1度の精度はあります。

double arccos(double t)
{
int i,j;
int n;
double a;
double p[8];
double cs,sn;

if (t>0.999999){return(0.0007);}

p[0]=1.0;

n=1;
if (t>0.91){n++;}
if (t>0.982){n++;}

if (t>=0.996){
if (t>=0.998){a=0.02;}else{a=0.03;}
}else{
for(j=1; j<8; j++){p[j]=p[j-1]*t;}
a=1.570796-p[1]-p[3]/6.0-p[5]*3.0/40.0-p[7]*5.0/112.0;
}

for(i=1; i<=n; i++){
for(j=1; j<7; j++){p[j]=p[j-1]*a;}
cs=1.0-p[2]/2.0+p[4]/24.0-p[6]/720.0;
sn=p[1]-p[3]/6.0+p[5]/120.0;
a=a+(cs-t)/sn;
}

return(a);
}

小林健太
erm...@ma4.seikyou.ne.jp
京都大学数理解析研究所修士課程

GON

unread,
Apr 3, 1999, 3:00:00 AM4/3/99
to
当然、どなたかのつっこみが入るだろうとは思いますが・・・

>d(Cos(-1)x)/dx = -1/(1-x^2)^(1/2)
> = -1 -x^2/2 -3x^4/8 -5x^6/16 -....

x=0の周りでの展開ですよね? っていうことはxが0に近いときしか
意味がありませんね。

わたしも他の方と同様、0.1度ごとにあらかじめ計算しておいた変換
テーブルを作って利用するのがベストだと思います。この程度ならたい
してメモリも食わないし、プログラミングの容易さや実行速度的に言って
も申し分ないと思いますよ。

Shiro KONO

unread,
Apr 6, 1999, 3:00:00 AM4/6/99
to
元記事を投稿したものです。

当方の開発環境では、何百ものデータをテーブルから読み込んだり、
詳細な場合分けを行っていると極端にパフォーマンスが落ちてしま
うので、ある程度の精度を有している事から、ぐりふぉんさんに教
えていただいた「べき展開」で試してみようと思います。

たくさんのフォロー、本当にありがとうございました。
また、何かの機会にはよろしくお願いします。<m(__)m>

Kobayashi Kenta

unread,
Apr 7, 1999, 3:00:00 AM4/7/99
to
小林です。

実際に試されて、それで問題ないのでしたらこれは無用なフォローですが…。

Shiro KONO wrote in message <7ed1lv$1kt$1...@meshsv230.tk.mesh.ad.jp>...


>当方の開発環境では、何百ものデータをテーブルから読み込んだり、
>詳細な場合分けを行っていると極端にパフォーマンスが落ちてしま
>うので、ある程度の精度を有している事から、ぐりふぉんさんに教
>えていただいた「べき展開」で試してみようと思います。


何百ものデータをテーブルから読み込む必要は無いと思われます。
最初に配列に取り込む手間は必要ですが、後は辞書を引く要領で、
900個のテーブルなら10回の比較を行えば良いだけです。

例の冪級数は、1に近い所で極端に精度が悪くなるので、本当に
それで所定の精度が得られるのでしょうか?
そもそも、例の級数は1では発散するというのに。

いや、ほんとに、実際に問題無いならいいんです。ただ少し気になっただけですか
ら。

小林健太
erm...@ma4.seikyou.ne.jp
京都大学数理解析研究所修士課程

Tohma Makoto

unread,
Apr 12, 1999, 3:00:00 AM4/12/99
to
藤間fromリムネットです。

In article <7edbj4$gbb$1...@wa1.seikyou.ne.jp>,
Kobayashi Kenta <erm...@ma4.seikyou.ne.jp> wrote:
>小林です。
>実際に試されて、それで問題ないのでしたらこれは無用なフォローですが…。

同じく。

>Shiro KONO wrote in message <7ed1lv$1kt$1...@meshsv230.tk.mesh.ad.jp>...

>何百ものデータをテーブルから読み込む必要は無いと思われます。
>最初に配列に取り込む手間は必要ですが、後は辞書を引く要領で、
>900個のテーブルなら10回の比較を行えば良いだけです。

 同感ですが…。

あるいは、もう少し間引いてそこで補完したりする手もありますね。

>例の冪級数は、1に近い所で極端に精度が悪くなるので、本当に
>それで所定の精度が得られるのでしょうか?
>そもそも、例の級数は1では発散するというのに。

興味があって、Mathematicaで計算してみました。
0<x<0.5ではそこそこあっているようですね。
そこから先はあまりよくないけど。

0.5から1の間は誤差が大きいからArcsinに置き直すなりして
計算したほうがいいと思います。
ホーナー法は当然お使いでしょうけど、それでも1に近づくとどんどん精度が落ちます。

>いや、ほんとに、実際に問題無いならいいんです。ただ少し気になっただけですか
>ら。

御意。
 この辺はかなり研究されてコンピュータの進歩と共に忘れられて行った
分野のようですね。
# ラジアンの公式ではなく度の公式の必要性を説かれていたのは
#名大に居られた二宮先生かなぁ?
--
藤間真(to...@st.rim.or.jp) <<リムネットからの発信です。>>
図書館に行ったときは駄目元で司書に相談しましょう。
利用者の手助けをし、疑問に答えることは、本来司書の業務の一部です。
日本の公共図書館では「駄目元で」と言わざるを得ないのが現状ではありますが

0 new messages