以度为单位评估trig函数而不是弧度

时间:2009-12-09 20:36:32

标签: c++ c objective-c

所以我在app中有一个函数,需要让用户使用弧度OR度计算trig函数(sin,cos,tan),并期望反向trig函数返回值(asin,acos,atan) )作为弧度或度数。有没有办法做到这一点,而无需直接转换为他们输入的东西?我想避免的是必须转换:罪(45)到罪(dtor(45)) 谢谢!

4 个答案:

答案 0 :(得分:2)

这应该由应用中的显示/输入例程来处理。具有可切换模式以使用度数或弧度,并且您的IO​​例程或者根据模式进行转换。我的意思是,90度 pi / 2弧度,只是使用愚蠢的惯例显示 - 因为它们代表相同的数量,它们在计算上的处理方式应该没有任何差别,只是一个怪癖表达方式类似于本地化。

您的实际计算代码只需要支持一种模式(应该是弧度)。

答案 1 :(得分:0)

没有办法改变功能的运作方式。

“解决方案”是重新制作界面并进行转换:

// for example
float sin(float pX)
{
    return std::sinf(d2r(pX));
}

然后使用该界面。将其放在math::命名空间中。

答案 2 :(得分:0)

如果你能接受度数和弧度,那么不确定是否有任何真正的方法。没有办法从输入中分辨出您正在使用的单位。例如,sin(2)具有2度和2弧度的有效值。

在输入功能之前,您必须进行适当的转换。 (或者,如果需要度数,则必须转换反向触发功能的输出。)

答案 3 :(得分:0)

我建议使用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类型,并重载这些类型的函数。