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