[英]evaluate trig functions in degrees as opposed to radians
所以我在應用程序中有一個函數,需要讓用戶使用弧度或度來計算觸發函數(sin,cos,tan),並且還希望反向觸發函數(asin,acos,atan)返回一個值弧度或度。 有沒有辦法在不將轉換器直接構建到他們輸入內容的方式的情況下做到這一點? 我試圖避免的是必須轉換:sin(45)到sin(dtor(45))謝謝!
這實際上應該由您應用中的顯示/輸入例程來處理。 有一個可切換的模式以使用度數或弧度,並且您的IO例程根據該模式進行轉換或不進行轉換。 我的意思是,90度是 pi / 2弧度,只是使用一個愚蠢的約定顯示-由於它們表示相同的數量,因此它們在計算方式上的處理應該沒有任何區別,只是類似於本地化的表示形式。
然后,您的實際計算代碼只需支持一種模式(應為弧度)。
無法更改功能的操作方式。
一個“解決方案”將是重新制作界面,然后進行轉換:
// for example
float sin(float pX)
{
return std::sinf(d2r(pX));
}
並改用該接口。 將其放在math::
名稱空間中。
如果可以同時接受度數和弧度,則不確定周圍是否有真正的解決方法。 無法僅從輸入中分辨出您正在使用的單位。 例如,sin(2)的有效值為2度和2個弧度。
在輸入功能之前,必須進行適當的轉換。 (或者,如果需要角度,則必須轉換逆向三角函數的輸出。)
我建議使用GMan解決方案的修改,並創建一個包含成員函數的類,這些成員函數是trig函數包裝,並且根據模式變量以弧度為單位進行操作 。
class cTrig
{
enum eTrigMode
{
DEGREES,
RADIANS
}
cTrig( eTrigMode mode = DEGREES ) : m_mode(mode) {}
void setMode( eTrigMode mode ) { m_mode = mode }
double sin( double theta )
{
return std::sin( m_mode == DEGREES ? deg_to_rad(theta) : theta ) ;
}
// ... etc for all other trig functions
} ;
這樣,您可以創建兩個具有不同模式的cTrig對象,或者創建一個對象並根據需要更改模式。 我會選擇前者:
cTrig degrees( cTrig::DEGREES ) ;
cTrig radians( cTrig::RADIANS ) ;
double a = degrees.sin( 90 ) ;
double b = ragians.sin( M_PI ) ;
我還將deg_to_rad和rad_to_deg包含為cTrig的成員函數。
您也可以創建cRadian和cDegree類型,並重載這些類型的函數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.