asin() 反正弦函数,求反正弦值
double asin(double x);
asin() 函数的功能是求反正弦值。反正弦函数 asin() 和正弦函数 sin() 的功能正好相反:sin() 是已知一个角的弧度值 x,求该角的正弦值 y;而 asin() 是已知一个角的正弦值 y,求该角的弧度值 x。
参数
-
x
正弦值。x 的取值必须位于区间[-1, 1]
中,如果 x 的值超出此区间,将会产生域错误(domain error)。
返回值
正常情况下(x 的取值位于区间[-1, 1]
),函数返回正弦值为 x 的角的弧度数。如果 x 的取值超出范围,那么 asin() 将发生域错误,此时返回值为 NaN。
发生域错误时,asin() 还会设置 <errno.h> 头文件下的 errno 和 <fenv.h> 头文件下的 FE_INVALID,我们也可以借此检测出域错误。关于域错误的更多内容请猛击《域错误(domain error)》。
实例
【实例1】求 0.5 的反正弦值(正常情况)。/* asin example */ #include <stdio.h> /* printf */ #include <math.h> /* asin */ #define PI 3.14159265 int main () { double param, result; param = 0.5; result = asin (param) * 180.0 / PI; printf ("The arc sine of %f is %f degrees\n", param, result); return 0; }运行结果:
The arc sine of 0.500000 is 30.000000 degrees
【实例2】求 2 的反正弦值(发生域错误)。
/* asin example */ #include <stdio.h> /* printf */ #include <math.h> /* asin */ #include <errno.h> /* errno */ #include <fenv.h> /* FE_INVALID */ #define PI 3.14159265 int main() { double result = asin(2) * 180.0 / PI; printf("result is :%f\n", result); if (errno == EDOM) { perror("errno == EDOM"); } if (fetestexcept(FE_INVALID)) { printf("FE_INVALID is set\n"); } return 0; }在 VS2015 下的运行结果:
result is :-nan(ind)
errno == EDOM: Domain error
FE_INVALID is set
在 GCC 下的运行结果:
result is :nan
errno == EDOM: Numerical argument out of domain
FE_INVALID is set
在 Xcode 下的运行结果:
result is :nan
FE_INVALID is set
不同的编译器对 NaN 的输出不同,具体原因请猛击《NaN(Not a Number),表示一个无效数字》。
Xcode 使用了较新的 C99 标准,当发生域错误时,不再设置 errno 的值了。