• ベストアンサー

sin(π)が0にならないです

C言語でsin(π)の値を出したいのですが0になりません。 1.224647e-16という値が出てきます。 sin(M_PI)と入力しています。 これを何とか0にする方法はないでしょうか? ご回答お願い致します。

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

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

浮動小数を使う限り誤差の問題が避けられないのは常識. sin(M_PI) を 0 にするなら「sin を呼び出す前に引数が M_PI なら 0 を返す」ようにするのが安全.

その他の回答 (3)

回答No.4

そもそも、C言語(など)の浮動小数点型は sin(0.1) == sin(0.1) がなりたたない場合があるほど(参考URL参照)です。 doubleやfloatを使うときは常に誤差を考えないといけません。 適当な閾値以下は0とみなす...というように実装することが多いです。

参考URL:
http://ml.tietew.jp/cppll/cppll/article/4285
  • titokani
  • ベストアンサー率19% (341/1726)
回答No.3

M_PIの値がπとは厳密には違うわけですから、どうにもなりません。 sin(180°)=0にするのなら、可能ですが。

  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.2

もしくは、しきい値を決めておき、sinの計算結果がその値以下(もしくは未満)ならば ゼロとみなす、という案もありかなと思います。 【付録】sin(M_PI)がゼロにならない理由 πは無理数である。有限小数では表わせない。 M_PIはπを近似した値である。πと正確に一致しているわけではない。 つまり、sin(M_PI) ≠ sin(π) = 0 である。

関連する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テーブル+テイラー展開による補正で相応の精度で値を出せるのなら 逆三角関数の値をこれを使って出せないかと考えました いろいろとサイトを回りましたが ほとんどが標準関数を使っての物だったので もし方法があるのならお答えいただけるとありがたいです

  • Math.sin(30) を度で

    Math.sin(30) で取得できるのはラジアンの値ですよね? そこで Math.sin(30) * 180 / Math.PI で度にしたいのですが、 結果は -56.61004208597725 になってしまいます。 なぜ 0.5 にならないのでしょうか、また、正しくは どう計算すればいいのでしょうか。よろしくお願いします。

  • C言語でsin2.212xという関数を定義にしたがって微分したいのです

    C言語でsin2.212xという関数を定義にしたがって微分したいのですがやり方がわかりません。 どなたか教えてください。 プログラムの完成系を教えてください。 それと解説もつけていただけるとありがたいです。 まだC言語はかなりの初心者ですので難しい表現などはなしで 説明していただけるとありがたいです。 また、df(x)/dxのdxを0.1,0.01としてそれぞれでの誤差を判定したいので dxは自分で好きな値を入力できるようにしたいです。 よろしくお願いします。

  • Excelのsin(180)について

    ExcelのSin180°を入力したときの質問です =SIN(RADIANS(180))とセルに入力しましたが結果は 1.22514845490862E-16となりました sin180°の場合は0になると思ったのですが・・・ このような結果になった理由を教えてください

  • sinθ、cosθ、tanθの問題

    tanθ+1/tanθ=2のとき、次の式の値を求めなさい。 (1)1/sin^2θ+1/cos^2=「4」 (2)1/sin^4θ+1/cos^4=「8」 上記2題の「」の値の求め方を教えて下さい。 また、 この手の問題を解くポイントがありましたら 併せてご回答のほう宜しくお願い致します。

  • エクセルの数式について

    16sin^3(2πt)という式を入力したいのですが =16*sin^3(2*PI()*t)とセルに入力してもちゃんと作動してくれません。 なんででしょうか? 是非ご回答よろしくお願いします。

  • sinカーブの表示のさせ方

    C言語で、sin(サイン)カーブをアスタリスクを使って表示するコードを教えてください。 お手数ですが、考え方についても、簡単で結構ですので教えていただければと思います。 よろしくお願いします。

  • C言語 ?のついた処理内容

    C言語初心者です。 FFTの勉強をしようと先人の作ったC言語プログラムを 参考に処理内容を勉強中ですが、以下の文が どのような処理を行っているのか理解できません。 ご存知の方たいへんおてすうですが、処理内容を ご教授をお願いします。 よろしくお願いします。  w = (flag? M_PI: -M_PI) / (double)n;

  • sinθの値をθを用いて表すには

    sin45°=(√2)/2 sin60°=(√3)/2 といったものや 2・3倍角の公式や半角公式とかで出るものはわかるのですが、 それらを使えない例えば sin1°とかsin√2°も知りたくなりました。 そこで、検索でも全然見当たらなかったのですが、sinθの値をθを用いて表した公式というのは存在するのでしょうか? もちろん、小数ではなく分数表記で出す方法をお願いします。

  • sin(x)の近似について

    sinxの数値計算 任意のxに対するsinxの値をマクローリン展開を利用して近似し、誤差の限界(n番目の値が1*10^-8)になるまでもとめよ。 という問題なんですが、for文でいろいろやってみたのですが、n番目の値が1*10^-8までというのがどうしてもできません。 C言語です。 たぶん、階乗の部分が間違ってると思われます。 下のが自分で考えたものです。アドバイスいただけたら嬉しいです。 #include <stdio.h> int main(void) { signed int i,v; double x=-1; double a,m,n=1.0; double sinx = 0.0; a=x; v=1; printf("a=%f\n",a); printf("sinx = %f\n",sinx); while(1) { sinx = sinx + a; m=x; m=m*x; a = (-1)*v*m/((n+1)*(n+2)); n=n+2; v=v*(-1); if ((a < 1e-8) && (a > -1e-8)) break; } printf("sinx = %f",sinx); return (0); }

専門家に質問してみよう