• ベストアンサー

Double Sin(double x) の定義ソース

こんにちは FloatのSin関数がある開発環境で、doubleやquadのデータ型は扱えます。 でもSinやPIの定義が float で、double の Sin関数アルゴリズムを探してます。 SIMDアセンブラプログラミングのテーブルで使いたいので、遅くても精度重視 で何かないでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • ninoue
  • ベストアンサー率52% (1288/2437)
回答No.3

google code searchでサーチすれば アセンブラ命令でのsin関数実現例等もあるようです。 http://www.google.com/codesearch/advanced_code_search それでも解決付かない時は、sin関数に要求される条件等を連絡下さい。 使うコンピュータのタイプ、(intel,powerpc,H8..) 概略性能(Mhz) float,double演算はサポートされているのか int64 add/mult/div、float,double function命令サポート fixfloat/intfloat変換命令サポート sin関数の入力データ範囲:double float 全域 OR -π/+π... テーブルを使うと考えられた理由等です。 希望演算速度、精度はdouble floating 精度必要なのか テーブルを使うとしてそのメモリサイズはどの位まで許されるのか これらの条件でどのようなやり方が良いかが変ってきますので -π/+πの範囲でsinπ(a+b)と変換し、sin/cosπaはテーブル引きonly (FFT用)、テーブル引き +1次近似(sin/cosπb)部分の合成により計算する といったことは良く行われています。 double data全範囲サポートとなるとかなりややこしくなります。 (abs(x)<<1.0 ==> sin(x)==x; abs(x)<π ( or abs(x)<π/4): y = sin(x)... abs(x)>=π ==> x=n*π+b, y = +/-sin(b) ... sin(b)の近似式展開ですが、基本はテイラー展開、項数をより少なく高速化するためには 最小二乗法近似、x^nについてx^n次以下の近似式(チェビシェフ近似)を用いてより低次の項に繰り込み項数を少なくする等の方法があります。

その他の回答 (3)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.4

意味があるかどうかわからんけど GNU MP+mpfr という方針もある.

  • arrysthmia
  • ベストアンサー率38% (442/1154)
回答No.2

三角関数のマクローリン展開は、 減少交代級数ですから、 収束も速く、打ち切り誤差の見積りも容易です。 事前にテーブルを作るだけで 目的プログラムの実行時には コードを走らさないのなら、 普通に級数展開で計算するプログラムを C か Fortran で まったり書けばよいのでは? とはいえ、テーブルが巨大にならないためには、 実行時に何らかの補間が必要になりそうですが。

  • proto
  • ベストアンサー率47% (366/775)
回答No.1

[技術者向] コンピューター > プログラミングのカテゴリーで聞く方が適切では無いでしょうか? 数学のカテゴリーではsin関数の数学的定義について語れる人は居るかも知れないですが、アルゴリズムや精度について語れる人は少ないような。

関連するQ&A

  • Sinテーブルの値からAtan等の値の出し方

    Sinテーブルを使い Atanの値を出す方法を探したのですが 方法が見つかりませんでしたので質問します 使用言語はC++です 次のようなSinテーブルがあるとします 大きさは901で0~90度までの値を分割して入れてある データ型はdouble テーブル引きの結果にSin、Cosの値を使った テイラー展開を用いて誤差を小さくしている 以下のサイトのSinテーブルを参考にしています http://ctrlwww.ee.noda.tus.ac.jp/wiki/kansai/index.php/%E4%B8%89%E8%A7%92%E9%96%A2%E6%95%B0%E3%81%AE%E9%AB%98%E9%80%9F%E5%8C%96 上記のSinテーブルを使うことで Sin、Cos、Tanの近似値が出せる状態から Asin、Acos、Atanの値を出す方法はあるでしょうか 標準関数を使えばいいと言われてしまえばそこで終わりですが せっかくSinテーブル+テイラー展開による補正で相応の精度で値を出せるのなら 逆三角関数の値をこれを使って出せないかと考えました いろいろとサイトを回りましたが ほとんどが標準関数を使っての物だったので もし方法があるのならお答えいただけるとありがたいです

  • STLのto_stringにlong double

    こんばんは。 STLにto_string関数を見つけました。 変数の型を見るとlong doubleもサポートしているようなので値を入れてみたところfloat値を文字列に変換したものしか得られませんでした。 どのようにすればlong doubleを文字列として取得できるのでしょうか? 環境はVisualStudio2013です。

  • Cのソースコード について

    使用言語はCです。 #include<stdio.h> #include<math.h> int main(void) { double x = 0, y = 0; while (1) { double arg2 = M_PI / 90; int arg1 = 90; int Arg = 0, Len = 0; scanf_s("%d,%d", &Len, &Arg); if (Len == 0 && Arg == 0) { break; } else { arg1 -= Arg; arg2 += (arg1 % 360)*M_PI / 180; x += cos(arg2)*Len; y += sin(arg2)*Len; } } printf("%d\n%d\n", (int)x, (int)y); while (1) {} return 0; } このコードをvisual studio でコンパイルしようとすると、 M_PIは定義されていない とエラーになってしまいます。 M_PIはmath.hに含まれているということでつかったのですが・・・・

  • PHPのソースの追いかけ方

    普段プログラミングやデザインをしないのですが、WordPressでオリジナルデザインを作ってみようと思っています。 秀丸エディタを使っているのですが、ソースを追いかけるのに、かなり時間を使ってしまい短縮出来ないものかと考えています。 Eclipseだと、関数の定義元にすぐジャンプしたり出来るようですが、秀丸エディタなどのエディタで開発されている方達はどのように追いかけているのでしょうか? テーマ独自の関数なのか、WordPress自体で定義されているのか、関数名だけでは分からなかったりと、一つの関数を追いかけるのも苦労しています。なにか良い方法があればと思います。それとも、1ファイルずつ開いて検索を繰り返すのが普通なのでしょうか? なお、Eclipseなどの統合環境はちょっと設定などが面倒で、重いのでなるべく避けています。

    • ベストアンサー
    • PHP
  • math.h等について

    ■質問1 #include <math.h> と書くだけで sin, cos, tan 等の様々な関数が使えますが、 inline float __CRTDECL sin(_In_ float _X) {return (sinf(_X)); } inline float sinf(_In_ float _X) {return ((float)sin((double)_X)); } などとなっていてsinがsinfを呼び出し、sinfがsinを呼び出し、sinが・・・ とグルグル回ってる気がするのですが実際どうなのでしょうか? ■質問2 質問1で述べたように実際にどのような計算でsinの値が弾かれているかわかりません。 マクローリン展開で近似された式を利用してsin関数ができると思うのですがmath.hをずっと眺めていてもみつかりませんでした。 どこに書いてあるのでしょうか? math.dllのようにライブラリ化しちゃってるのを呼び出してるだけなのでしょうか?

  • MySQLの浮動小数点の定義について

    いまMySQLの浮動小数点の定義を行っているのですが, ↓↓↓↓↓ create talbe [table_name]( id int not null auto_increment, data1 double [(1)], primary key(id) ); の(1)のdouble型の精度の宣言方法が分かりません…。 どうやって宣言すればいいのか教えていただけませんか? 具体的に例を挙げていただけたら幸いです。

  • Accessのリンク先を相対パスにしたい

    Access2010をつぎのような環境で開発しています。 c:\開発\データ.accdb  テーブル定義と実データ格納 c:\開発\アプリ.accdb  データ.accdbのテーブル定義へのリンクとフォームなど これを本番のネットワーク環境 “\\network\本番” に設置した場合、 「c:\開発\データ.accdbは無い」旨のエラーになってしまいます。 また、本番環境のパス名はインストール先によって異なります。 Access2010のリンクマネージャでは絶対パスでのリンクしか定義できないようですが、 カレントパスに変更するには、アプリ.accdb を起動時に毎回、動的に変更するしかないのでしょうか? お教えいただきたくお願いいたします。

  • 音の波形 tan()

    教えてください 音のデータ作成のために三角関数を使ってみているのですが //xは0~2です sin( M_PI * x ) * 32767; cos( M_PI * x ) * 32767; で出来ました tan()の場合はどうすればよいでしょうか? 引数の範囲は M_PI * 0 ~ M_PI * 2 なのでしょうか? すみませんよろしくお願いいたします。

  • (続)テーブル定義書の出力

    こんにちは。 前回も同じ質問をさせていただき、回答をいただいたのですが、私の説明不足で回答者様の厚意を無駄にしてしまいました。 よろしければ、また、教えていただきたいと思います。 VisualBasicでデータベースに接続を行い(接続は完了しています。)テーブル定義書を出力したいときはどうしたらよいでしょうか?? 考えたのは ボタンクリック ↓ DB接続 ↓ 定義書の元になるデータを読み込む ↓ エクセルに書き込む なのですが…うまくいきませんでした。 DBにはうまく接続できるのですが… まともな開発が今回が初めてなので不安です

  • C言語イプシロン値

    現在使用中の開発環境(C言語使用)標準ヘッダfloat.hに単精度浮動小数点数イプシロン値が下記のように定義されています。 #define  FLT_EPSILON   0x8p-26F 「0x8p-26F」なる表現を初めて見たのですが、これはどういう意味で、具体的にどんな数字になるのでしょう? ご存じの方、教えてくださいませ。 よろしくお願いします。