Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c与matlab'等价;s-sind和cosd函数_C_Matlab_Math.h - Fatal编程技术网

c与matlab'等价;s-sind和cosd函数

c与matlab'等价;s-sind和cosd函数,c,matlab,math.h,C,Matlab,Math.h,所以我正在用一些matlab代码手工转换成c代码。我只是想知道是否有一个c等价于我在matlab代码中看到的sind和cosd函数。我猜这会返回以度为单位的答案,而不是以弧度为单位的c sin和cos函数。我想我可以把结果乘以180/pi,但我想知道数学中是否有库函数。或者即使gsl库中有这样的东西 不在C库中。所有三角函数C库函数都将参数作为弧度值而不是度数。正如您所说,您需要自己执行转换或使用专用库。不,C标准库中的三角函数都以弧度为单位工作。但您可以轻松地使用宏或内联函数: #define

所以我正在用一些matlab代码手工转换成c代码。我只是想知道是否有一个c等价于我在matlab代码中看到的sind和cosd函数。我猜这会返回以度为单位的答案,而不是以弧度为单位的c sin和cos函数。我想我可以把结果乘以180/pi,但我想知道数学中是否有库函数。或者即使gsl库中有这样的东西

不在C库中。所有三角函数C库函数都将参数作为弧度值而不是度数。正如您所说,您需要自己执行转换或使用专用库。

不,C标准库中的三角函数都以弧度为单位工作。但您可以轻松地使用宏或内联函数:

#define sind(x) (sin((x) * M_PI / 180))

请注意,如果要更改函数(所谓的逆函数或“arcus”函数)的返回值,则需要与转换相反的结果:


不,它们在C库中不可用。您将只能在C库中找到弧度值参数或返回值。

H2CO3的解决方案将由于
M_PI
的不精确性而对大参数造成灾难性的精度损失。任何参数的通用安全版本为:

#define sind(x) (sin(fmod((x),360) * M_PI / 180))

另外,请注意sind和cosd等不以度为单位返回结果,它们以度为单位获取参数。asind和acosd以度为单位返回结果。

同样相关:看看……如果
M_PI
有1000位精度,那就没什么用了。2**1000次
M_PI
在计算模2π的地方仍然是完全错误的。假设
x
0x168p1000
<代码>sind(x)应为0。但是如果将
0x168p1000
乘以
M_PI
,结果肯定不会接近360π的整数倍。@R..:我明白了,我同意这很有帮助。但是通过这种技术改进的
x
的值在某种程度上是稀疏分布的,不是吗?实际上,如果您有0x168p1000,则很可能在应用
sin
函数之前已经失去了精度。@OliCharlesworth:0x168p1000不代表大约0x1p947的间隔。根据IEEE 754,它正好代表一个数字,168乘以2乘以1000的幂。然后,人们可能会继续在代码中添加另一层语义,使用精确的值来表示不精确的值,但数学库例程通常不能假设这一点。它应该假设它所给出的输入正好代表IEEE 754标准所说的。@OliCharlesworth:在为给定的精确输入设计一个例程和为给定的不精确输入设计一个例程之间的选择是显而易见的。好的软件可以避免失去准确性,也不会认为搞砸是可以的。我知道很多人使用浮点数的方式非常草率。他们不应该这样做。请停止鼓吹坏的软件实践。
inline double asind(double x)
{
    return asin(x) / M_PI * 180;
}
#define sind(x) (sin(fmod((x),360) * M_PI / 180))