Sinテーブルを使い
Atanの値を出す方法を探したのですが
方法が見つかりませんでしたので質問します
使用言語はC++です
次のようなSinテーブルがあるとします
大きさは901で0~90度までの値を分割して入れてある
データ型はdouble
テーブル引きの結果にSin、Cosの値を使った
テイラー展開を用いて誤差を小さくしている
以下のサイトのSinテーブルを参考にしています
http://ctrlwww.ee.noda.tus.ac.jp/wiki/kansai/ind …
上記のSinテーブルを使うことで
Sin、Cos、Tanの近似値が出せる状態から
Asin、Acos、Atanの値を出す方法はあるでしょうか
標準関数を使えばいいと言われてしまえばそこで終わりですが
せっかくSinテーブル+テイラー展開による補正で相応の精度で値を出せるのなら
逆三角関数の値をこれを使って出せないかと考えました
いろいろとサイトを回りましたが
ほとんどが標準関数を使っての物だったので
もし方法があるのならお答えいただけるとありがたいです
No.6ベストアンサー
- 回答日時:
x とか y とかがなんのことなのかわからないのですが, とりあえず
atan x
を求めたいなら
y = x/√(x^2+1)
で求まる y を sin のテーブルから探せばよいということになります.
で, その URL に「平方根の逆数」を求めるアルゴリズムがあるので, そいつを使えば除算を乗算に置き換えることができるはず. 誤差はよくわからんけど, 気になるならニュートン法を一発かませばいいような気がする.
ごめんなさい
トラブルで長期間ネットに繋げない状態でした
回答ありがとうございます
とりあえず教えて頂いた方法を使って
なんとかしてみようと思います。
No.5
- 回答日時:
あ, sin のテーブルがあるときに atan を計算したいってことね.
y = tan x のとき sin x = y/√(y^2+1) と sin に変換すればいいってことにはなる... けど, なんか平方根と除算がくやしい. 工夫すれば除算の代わりに乗算にできたような気もするけど忘れた. この辺はハードウェアがどこまでサポートしてるかにもよるかな?
直接的には atan のテーブルを持ちそうだけど, sin や cos と違って tan は値域に制限がないので, atan のテーブルの大きさをどうするかという問題が発生する. もちろんがんばればいいんだけどかえって tan のテーブルから探索した方が速い可能性すらある.
この回答への補足
平方根に関して言えば
このURL先にある方法で少しだけでも高速化はできそうです
http://www001.upp.so-net.ne.jp/y_yutaka/labo/mat …
除算に関しては難しいところですね
今回の場合は
yの値をx/yの結果として
y/√(y^2+1)を
サインテーブルの引数に
入れればいいということでいいのでしょうか?
自分の理解力が無いのが悪いのですが
このあたりの回答もあるとありがたいです
No.4
- 回答日時:
テーブルから検索する方法ですが、
tanθ=sinθ/cosθ
でtanθのテーブルを作ります。-90~90度の範囲では単調増加の関数になりますので(対称なので0から90でよい)、二分探索などで探せばそこそこの速度がでます。
参考
http://ja.wikipedia.org/wiki/二分探索
更に速くしたいのでしたら、atanのテーブルを作ってしまうか、荒いatanテーブルを作って、tanのテーブルを引き始める場所が分かるようにします。
ピッタリの値はまず無いので、前後の値を使って補間します、直線補間が簡単なのですが、二次関数程度がそこそこの精度がでるはずです。
参考
http://ja.wikipedia.org/wiki/内挿
No.3
- 回答日時:
そのままのテーブルを使うとなると、逆関数の場合はテーブルの計算値から探し出さないとならないので、効率は悪くなります。
幸いどれも単調な関数ですので、単調増加あるいは単調減少になっていますので、探し方を工夫すればそれなりの速くはなります。
それよりも同じように逆関数のテーブルを作る方が速度は稼げます。
昔のCPUが遅い時代にはテーブルから値をとってくる方法が結構行われていました。
最近のCPUは計算は速いが、メモリアクセスそれに比べて極端に遅いし、テーブル引きの場合にはベクトル化をやりにくいので、あまりメリットがないように思います。一度比べてみられてはいかがでしょうか。
精度、速度ともに興味深い結果になるかも知れません(私も興味があります)
コンパイラに備わっている関数はベクトル化が可能で十分な精度が出るように思うのですが、どうなんでしょうか。
この回答への補足
確かに最近のCPUは性能が良いですが
ハードによってまちまちだと思います
一口にCPUと言ってもデスクトップ、ノート、スマホ、etc・・・とありますしね
なのでメリットは現在でもしっかりとある、と考えています
速度計測はすでに行いましたが
あまり変わらなかったという結果でした、が
あくまでも自分の環境の話です
他の方の環境でも同じとは限らないと考えてます
今回の質問は
sinテーブルからatanの値を出せないか?
そして、具体的な式や方法は?結果はどうなるのか?
といった疑問を解消するためですので
ベクトル化などに関しては考えていません
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 数学 θ=π/2 のまわりでの f(θ)=sinθ/cosθのローラン展開に関して 以外の「」の解答を頂き 13 2022/11/11 09:45
- 高校 変数の置き換えと範囲の確認につきまして 1 2022/05/21 14:31
- 数学 高校生です。 この問題が解説がないため合ってるか分かりません。 この回答であってますか? 回答 g( 3 2023/01/24 14:05
- 数学 sin(45°-x)=sin(x+135°)が成り立つと思うのですが、 これを加法定理を使わずに(三 4 2023/05/25 12:34
- 数学 回答者どもがなかなか答えられないようなので、考えてみました。 ∫[0,π/2]log(sinx)/( 4 2022/08/31 16:30
- 時計・電卓・電子辞書 電卓この関数電卓を使ってsin 14、2°を計算したいんですけど14、2の°の出し方がわかりません。 3 2023/07/26 13:44
- 数学 単振り子とルンゲ・タック法 1 2022/07/15 00:05
- Access(アクセス) Accessテーブルの結合で別々のテーブルのフィールドを組み合わせて値を出す方法について 2 2022/07/20 19:43
- その他(自然科学) 電磁波モデルで疑問 4 2023/07/09 14:44
- 数学 数学の問題です。回答よろしくお願いします。 sinが無限に続く関数f(X)=sin(sin(sin( 3 2022/09/21 10:40
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ExcelVBAからAccessMDB内のテー...
-
Accessで別mdbのテーブルをコピー
-
『列名 '担当者CD' があいま...
-
ExcelからAccessのテーブルに書...
-
ACCESS2010 実行時エラー 2766
-
DataGridViewに複数テーブルの...
-
ワークテーブルの作成について
-
ADO&mdbで、リンクテーブルの...
-
エクセルのテーブルを解除する...
-
(泣)VBscriptでinnerhtmlを使...
-
SQLを発行とは?クエリの作成と...
-
VB.NET データセットとADOレコ...
-
vb ado → vb2005 ado.net変換
-
VB.NETでのAccessテーブルリンク
-
Access2003VBA リンクテーブル...
-
DataGridの中身をDataSetにテー...
-
AccessからExcelへエクスポート...
-
SQL文の最後に「;」はいら...
-
VBとアクセスでSQL文に変...
-
同一セッションIDのブラウザを...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBとアクセスでSQL文に変...
-
Accessで別mdbのテーブルをコピー
-
他のMDBのテーブルに追加したい
-
SQLを発行とは?クエリの作成と...
-
手動または分散トランザクショ...
-
HTMLのテーブルの行数が多くな...
-
エクセルのテーブルを解除する...
-
ExcelVBAからAccessMDB内のテー...
-
Excel複数シートをaccessへ一括...
-
DataGridの中身をDataSetにテー...
-
CSVファイルのエクスポートでソ...
-
AccessからExcelへエクスポート...
-
.net 複数の主キーを設定する方法
-
『列名 '担当者CD' があいま...
-
COBOLのINVALID KEYが理解でき...
-
アクセステーブル、リンクとロ...
-
ACCESSのテーブル名をリストに...
-
MDBテーブルへの追加変更を教え...
-
【ADO】「Execute」を使うと...
-
ACCESS2010 実行時エラー 2766
おすすめ情報