5

重複の可能性:
正弦180の値を1.22465e-16として取得

円周上の点を計算しています。円の半径と中心点があります。ここでは、大したことですが、同じための直接的な公式があります。ええ、角度はラドです

x = x + r*sin(angle)
y = y + r*cos(angle)

さて、ここでの問題は、角度をラジアンで通過しているにもかかわらずです。しかし、私は以下の角度について正しい答えを得ることができません

for 90 degree (rads = 1.5708) i get y axis = -4.3774e-08
for 180 degree (rads = 3.14159) i get x axis = -8.74228e-08
for 270 degree (rads = 4.71239) i get y axis = 1.19249e-08
for 360 degree (rads = 6.28319) i get x asix = 1.74846e-07

度をラジアンに変換しています

return degrees * M_PI / 180;

なぜこれが起こっているのかわかりません。何か深刻な問題があるに違いありません。

これが変換に使用されるコードです

float angle = DegreesToRadians(90);

float x = sin(angle);
float y = cos(angle);

誰かがこれを手伝ってくれますか?

4

3 に答える 3

8

M_PI「math.h」で次のように定義されています

#define M_PI        3.14159265358979323846264338327950288

これは(無理数) Pi の近似値にすぎません。したがって

cos(M_PI/2), sin(M_PI), cos(3*M_PI/2), sin(2*M_PI)

ほぼゼロです。floatPi は、またはとして正確に表すことはできませんdouble

あなたの出力から、あなたが使用したと思いますfloat。a の有効桁数は約 7 であり、その点でのとfloatの傾き (一次導関数) はであるため、期待どおりの結果が得られたと言えます。で作業すると、より良い結果が得られますが、正確にゼロではありません。sin()cos()+/- 1double

したがって、深刻な問題はありません。浮動小数点計算の結果が正確であるとは期待できません。

于 2012-12-12T18:33:07.297 に答える
1

重複した質問にコメントを追加するには...

1 つの代替方法は、ラジアンの代わりにグラードまたは度を使用することです。これにより、完全な円の倍数と各象限の倍数が整数になり、これらの引数のサインとコサインも正確に表すことができます。

また、数学ライブラリの一部の実装が pi の倍数をどれだけうまく処理できるかに驚く必要があります。float または double での pi の表現は、真の値からわずかなdeltaだけずれているため、N*(pi+-delta) は次のようになります。 N*delta だけ真の値からずれています。したがって、適切に作成されたライブラリでは、sin((pi/2)+(2*pi)*n) が n とともに増加します。不十分に作成されたライブラリでは、引数は 2*pi のモジュロ近似で評価され、すべてのnに対してまったく同じオフセットが与えられます。

于 2012-12-13T15:33:18.357 に答える
0

一般に、フロートを処理する場合、結果を(等しい場合は)特定の数値と比較することはお勧めできません。0、1、さらにはpiまたはeの場合もあります。-8.74228e-08は、実質的にすべての計算可能なケースで0として扱われるのに十分に近いです。(そうでない場合は、とにかくfloat / doubleで重要な問題があります)

プログラムコードでそれらを比較する必要がある場合は、値を差し引いて、結果を<または>およびいくつかの非常に小さい数と比較する必要があります。例えば

if (sin(something*pi) < 0.0001f) ...

それよりも

if (sin(something*pi) == 0) ...
于 2012-12-12T19:03:26.837 に答える