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

A 回答 (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の間にあればゼロと
みなすというようなやり方です。
その精度では満足できないということであれば、もっと桁数の多い新たな数値型のクラスを定義するしかないと思います。
    • good
    • 0
この回答へのお礼

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

お礼日時:2001/12/03 15:52

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aと関連する良く見られている質問

QMath.sqrt(Math.pow(canvas.width / 2, 2) + Math.pow

どういう意味でしょうか?
・JavaScriptというよりは、数学(平方根とか)の意味がよく分からないのですが、
・累乗した後、平方根を求める?
・何のために?

Math.sqrt(Math.pow(canvas.width / 2, 2) + Math.pow(canvas.height / 2, 2)) | 0;

Aベストアンサー

こんにちは

三平方の定理(ピタゴラスの定理)
幅と高さのそれぞれの2乗の和の平方根を求めているので、対角線の長さを求めていることになります。
ご提示の式では、それぞれ1/2にしているので、結果は対角線の半分の長さになります。
(= 4分割した四角形の対角線)

http://chu.benesse.co.jp/qat/6434_m.html

QMath.randomは0にはならない? 0になる

・意味が分からないコードがあるので教えてください

■コード
for (var i = 0; i < 10; ++i) {
 switch ((Math.random() * 4) | 0) {
 case 0: hoge(); break;
 case 1: ……

■質問
・これはどういう処理をするコードでしょうか?
・「Math.random … 0 以上1未満」ということは0にはならないのでしょうか? なぜ「 | 0」?
・breakした場合、switchは抜けるけど、for文は継続?

Aベストアンサー

Math.random()は、 0 以上 1 未満 ということで、0 になることもあります。1にはなりません。
「 | 0 」は、0 と or でビット演算をするということですが、演算結果は整数となります。
Math.random()は、小数になるので、小数点以下を切り捨てるために、「 | 0」が付いているんですね。

breakは、switchのみを抜けます。breakが無いと、case 0の処理の後にcase 1の処理も実行してしまいます。

QMath.sin(30) を度で

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

Aベストアンサー

>Math.sin(30) で取得できるのはラジアンの値ですよね?
違います。Math.sin()関数はラジアンから正弦を求める関数です。
Math.sin(?)で0.5にしたいなら、まずは度からラジアンに変換してから計算してください。
度からラジアンを求めるなら
ラジアン = (度 / 180) * Math.PI
で求められます。

QMath.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

お世話になります。
物体を投げたときの距離を出す問題なのですが、激しく計算が合わず、例文の通りの答えが出ません。(マイナス値になってしまう)

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)...続きを読む

Aベストアンサー

角の表し方には角度(degree)とラジアン(radian)があります。
π = 3.14159265… (円周率)としたとき
360°(degree) = 2π(radian)
となります。

なので、30°(degree)というのはπ/6(radian)で表すことができます。
あとは他の回答者様が言われている通り、
double angleA = 30; //発射角度
という行をラジアンに直せば良いかと思います。

QMath.minについて

配列に格納した値の最小値を取得するために、下記のようなソースを書いたのですが、
配列の値全てが表示されてしまいます。どこが間違っているでしょうか?

var latlng2 = new Array() ;
for (var i = 0; i < 5; i++) {
var lat1 = i;
latlng2[i] = lat1;
}
alert(Math.min(latlng2));

Aベストアンサー

こんにちは。

配列の場合は
Math.min.apply(Math,latlng2)
だと思います。


人気Q&Aランキング

おすすめ情報