• ベストアンサー

Math.sin()メソッドについて

Math.sin(Math.PI)の帰り値が0になってくれません。どなたかわかる人 原因も沿えて教えてください。

  • Java
  • 回答数1
  • ありがとう数1

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

  • ベストアンサー
  • ranx
  • ベストアンサー率24% (357/1463)
回答No.1

Math.PI の仕様は次のようになっています。 The double value that is closer than any other to pi, the ratio of the circumference of a circle to its diameter. πに最も近い値ということですね。元々無理数ですから、64ビットの浮動小数点形式では、どうしても表わしきれないわけです。 一方Math.sin()の方はコンピュータのネイティブコードを呼び出すことになっています。したがって、この値はライブラリ関数の 実装に依存することになりますが、上記の数値精度および演算誤差から、どうしても数値精度程度の誤差は生じてしまいます。 コンピュータというものはそういうものだと割り切って考えるしかないのかもしれません。 これぞという解決法にはお目にかかったことが無いように思います。一般的には、数値にある程度の許容量を設け、その中に入って いれば同等に扱うというようなやり方をしているように思います。例えば、問題のケースであれば、値が±1E-10の間にあればゼロと みなすというようなやり方です。 その精度では満足できないということであれば、もっと桁数の多い新たな数値型のクラスを定義するしかないと思います。

pecopeco21
質問者

お礼

ありがとうございます。やはり解決法はなかったのですね。

関連するQ&A

  • Math.sin(30) を度で

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

  • 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のようにライブラリ化しちゃってるのを呼び出してるだけなのでしょうか?

  • Math.sin() を使った計算が合わない

    お世話になります。 物体を投げたときの距離を出す問題なのですが、激しく計算が合わず、例文の通りの答えが出ません。(マイナス値になってしまう) double decel = 10; //減速率(秒) double angleA = 30; //発射角度 double veroU = 200; //水平移動距離(m/s) とした時、 double sinV = Math.sin(angleA); double cosH = Math.cos(angleA); で、 double vu = veroU * sinV; //縦の力 double hu = veroU * cosH; //水平の力 double t = (2 * vu) / decel; //減速率 double s = hu * t; //距離(m) とすると s の値がマイナス千二百あたりになってしまいます(プラス三千あたりが正解)。何か致命的に間違っているような気はするんですが…。 出来るだけ自力で解きたいので、ズバリの答えよりも、ヒントになるJAVAのアドバイス頂けるとありがたいです。宜しくご教示ください。 m(_ _)m

    • ベストアンサー
    • Java
  • sin(π)が0にならないです

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

  • プログラムですけど、問題はsinθとcosθです

    <script language="JavaScript"> <!-- iList = ["img0","img1","img2","img3","img4","img5"]; mx = my = cnt = 0; r = 35; function rotIMG(){ for (i=0; i<iList.length; i++){ n = (i * (360 / iList.length) + cnt++) * Math.PI / 180; document.images[iList[i]].style.pixelLeft = mx + Math.sin(n) * r; document.images[iList[i]].style.pixelTop = my - Math.cos(n) * r; } } // --></script> これで document.images[iList[i]].style.pixelLeftは横の位置を document.images[iList[i]].style.pixelTop は縦の位置を 導き出しているんですよね。 そうすると、Math.sin(n) * r は縦の長さをMath.cos(n) * r は横の長さを表してる訳ですから mx + Math.sin(n) * r とmy + Math.cos(n) * r は 長さを導き出すのに矛盾してないでしょうか。 ここまで頭が悪くて相当ショックを受けているんですけど。 詳しい説明を含めて宜しくお願い致します。

  • アナログ時計のつくりかた

    お世話になります。 現在アナログ時計を作成しているのですが、 時間を指す針がうまく動いてくれません。 今は、5時代なら5のところを指すだけで、 6時までの中間地点を全く指してくれない状態です。 import java.awt.*; import java.applet.*; import java.util.*; public class tokei extends Applet{ public void paint(Graphics g){ g.drawOval(0,0,150,150); Calendar cal=Calendar.getInstance(); int hr = cal.get(Calendar.HOUR); int min = cal.get(Calendar.MINUTE); int x0, x1, y0, y1, x2, y2, r1=30, r2=45; x0=75; y0=75; x1=75+(int)Math.rint(r1*Math.sin(hr/12.0*2*Math.PI)); y1=75-(int)Math.rint(r1*Math.cos(hr/12.0*2*Math.PI)); g.drawLine(x0, y0, x1, y1); x2=75+(int)Math.rint(r2*Math.sin(min/60.0*2*Math.PI)); y2=75-(int)Math.rint(r2*Math.cos(min/60.0*2*Math.PI)); g.drawLine(x0, y0, x2, y2); } } x1=75+(int)Math.rint(r1*Math.sin(hr/12.0*2*Math.PI)); y1=75-(int)Math.rint(r1*Math.cos(hr/12.0*2*Math.PI)); の部分が間違っているのだろうなと思うのですが、 どのように直せばよいのかわかりません。 恐れ入りますが、どなかた教えて頂けないでしょうか? どうぞよろしくお願いいたします。

  • sin曲線とcos曲線を描くプログラムについて

    お世話になります。 Javaのプログラミングを習い始めたものです。 標記の件ですが、プログラムを見てもどうしてそうなるかが さっぱりわからない部分があります。 import java.awt.*; import java.applet.*; public class Example2 extends Applet{ public void paint(Graphics g){ // 座標軸を描く g.drawLine(20, 10, 20, 130); g.drawLine(20, 70, 230, 70); // sinカーブを描く(20->220) g.setColor( Color.blue); int x0, y0, x1, y1; x1 = 20; y1 = 70; for (int i = 1; i <= 20; i++){ x0 = x1; y0 = y1; x1 = 20+(int)(i/20.0*200); y1 = 70-(int)(50.0*Math.sin(i/20.0*2*Math.PI)); g.drawLine(x0, y0, x1, y1); } // cosカーブを描く(20->220) g.setColor( Color.red); x1 = 20; y1 = 20; for (int i = 1; i <= 20; i++){ x0 = x1; y0 = y1; x1 = 20+(int)(i/20.0*200); y1 = 70-(int)(50.0*Math.cos(i/20.0*2*Math.PI)); g.drawLine(x0, y0, x1, y1); } } これで、赤と青の曲線が描かれるわけですが、 x1 = 20+(int)(i/20.0*200); y1 = 70-(int)(50.0*Math.sin(i/20.0*2*Math.PI)); の部分がさっぱりわかりません。 今まで、"int"は変数宣言でしか用いられなかったのに、 今回突然この式の中に組み込まれており困惑しています。 また、iが回数を表すのはわかりますが、それを全回数で割ったり、 x1の式の中でなぜ200を掛けるのか、 y1の式の中でなぜ2を掛け、さらに円周率まで掛けるのかが どうしても理解できません。 どなたか、ご教授願えませんでしょうか。 あるいは、参考になるサイトを教えていただければ助かります。 どうぞよろしくお願いいたします。

    • ベストアンサー
    • Java
  • math type 3.0について

    math type 3.0を使っているのですが、いちいち 挿入→オブジェクト→math type 3.0 とするのは面倒でたまりません。 ショートカットキーがあると思うのですが、ググっての見つからず、みなさんに質問しました。 math type 3.0の起動や数式などに関するショートカットキー一覧のサイトなどご存知でしたら教えていただけませんか? よおろしくお願いします。

  • sin(x)のマクローリン展開

    明日解析のテストがあるのですが、 わからないところあります。 sin(x)のマクローリン展開を n回微分を用いて求める問題なのですが (sin(x))'=cos(x)=sin(x+pi/2) 同様にして (sin(x))^(n)=sin(x+pi*n/2) ここからマクローリン展開の係数の 出し方がわかりません。どなたか よろしくお願いします。

  • math.h

    C言語で以下のプログラムを打ちました #include <stdio.h> #include <math.h> main(){ printf("%f\n",sin(23.5)); } そして。下記の用に実行すると以下のようにエラーがでます。エラーからするにサイン関数が見つからない用な事いっているのですが、一体なん何んでしょう? ちなみに。OSはRed hut Linux 7.3です. % gcc -o sample sample.c /tmp/ccwod1zy.o: In function `main': /tmp/ccwod1zy.o(.text+0x17): undefined reference to `sin' collect2: ld returned 1 exit status