2017-01-07 12 views
-5

精度は約0.000001が欲しいです。ここC++のsinlとcosl関数の精度

typedef struct p { 

    long double x; 
    long double y; 

}point; 

point rotate_point(long double cx,long double cy,long double angle,point p) //pivot then angle then point to rotate 
{ // cout<<"\ncx="<<cx<<"cy="<<cy<<"x="<<p.x<<"y="<<p.y; 
    angle=(angle/100)*pi*2; 


    // translate point back to origin: 
    p.x -= cx; 
    p.y -= cy; 
    cout.setf(ios::fixed); 
cout.setf(ios::showpoint); 
cout.precision(20); 

    // rotate point 
    long double xnew = p.x * cosl(-angle) - p.y * sinl(-angle); 
    long double ynew = p.x * sinl(-angle) + p.y * cosl(-angle); 

    // translate point back: 
    p.x = xnew + cx; 
    p.y = ynew + cy; 
    cout<<"x="<<p.x<<"y="<<p.y; 
    return p; 
} 

は私がcxcyが回動され、ここで、所定のピボット約点を回転させる機能rotate_pointを使用して、pointが時計方向に回転する点で、angle午前使用していたコードセグメントであります度数で渡される角度です(ラジアンで渡すことはできません)。私の問題は、値を持つ関数を呼び出すときですrotate_point(50,50,25, p) ここでp.x=50 p.y=100期待される出力はx=100 y=50です。

私はx=99.99999000666841262458 y=49.96838777042233631365を取得しています。xは正常ですが、yは希望する精度の範囲ではありません。あなたは、精度が必要な場合は

+0

[ルール](https://www.facebook.com/hackercup/terms/)は「問題を解決しないでください」とは言いません(https://www.facebook .com/hackercup/problem/1254819954559001 /) –

+0

'angle =(angle/100)* pi * 2;とは何ですか?ラジアン換算ではありませんが、それに似ています。 'π'とは何ですか?おそらく、あなたは 'pi = 3.142'または他のcrass値を持っています。数学ライブラリのヘッダーに定義されている値を使用します。 –

+0

piは#define pi(22/7)で、実際にその度数をラジアン変換します (angle/100)* pi *(360/180) –

答えて

-1

pi = 22/7 

値を使用しないでください。

M_PI 

これはmath.hで定義されています。 MSVCでも必要です。

#define _USE_MATH_DEFINES 

次の値を使用できるようにする必要があります。

#define M_E  2.71828182845904523536 // e 
#define M_LOG2E 1.44269504088896340736 // log2(e) 
#define M_LOG10E 0.434294481903251827651 // log10(e) 
#define M_LN2  0.693147180559945309417 // ln(2) 
#define M_LN10  2.30258509299404568402 // ln(10) 
#define M_PI  3.14159265358979323846 // pi 
#define M_PI_2  1.57079632679489661923 // pi/2 
#define M_PI_4  0.785398163397448309616 // pi/4 
#define M_1_PI  0.318309886183790671538 // 1/pi 
#define M_2_PI  0.636619772367581343076 // 2/pi 
#define M_2_SQRTPI 1.12837916709551257390 // 2/sqrt(pi) 
#define M_SQRT2 1.41421356237309504880 // sqrt(2) 
#define M_SQRT1_2 0.707106781186547524401 // 1/sqrt(2)