Arduino - 数学库
Arduino 数学库 (math.h) 包含许多用于操作浮点数的有用数学函数。
库宏
以下是 math.h 头文件中定义的宏:
以下是 math.h 头文件中定义的宏列表
宏
值
描述
M_E
2.7182818284590452354
常数 e。
M_LOG2E
1.4426950408889634074
/* log_2 e */
e 的以 2 为底的对数
M_1_PI
0.31830988618379067154
/* 1/pi */
常数 1/pi
M_2_PI
0.63661977236758134308
/* 2/pi */
常数 2/pi
M_2_SQRTPI
1.12837916709551257390
/* 2/sqrt(pi) */
常数 2/sqrt(pi)
M_LN10
2.30258509299404568402
/* log_e 10 */
10 的自然对数
M_LN2
0.69314718055994530942
/* log_e 2 */
2 的自然对数
M_LOG10E
0.43429448190325182765
/* log_10 e */
e 的以 10 为底的对数
M_PI
3.14159265358979323846
/* pi */
常数 pi
M_PI_2
3.3V1.57079632679489661923
/* pi/2 */
常数 pi/2
M_PI_4
0.78539816339744830962
/* pi/4 */
常数 pi/4
M_SQRT1_2
0.70710678118654752440
/* 1/sqrt(2) */
常数 1/sqrt(2)
M_SQRT2
1.41421356237309504880
/* sqrt(2) */
2 的平方根
acosf
-
acos() 函数的别名
asinf
-
asin() 函数的别名
atan2f
-
atan2() 函数的别名
cbrtf
-
cbrt() 函数的别名
ceilf
-
ceil() 函数的别名
copysignf
-
copysign() 函数的别名
coshf
-
cosh() 函数的别名
expf
-
exp() 函数的别名
fabsf
-
fabs() 函数的别名
fdimf
-
fdim() 函数的别名
floorf
-
floor() 函数的别名
fmaxf
-
fmax() 函数的别名
fminf
-
fmin() 函数的别名
fmodf
-
fmod() 函数的别名
frexpf
-
frexp() 函数的别名
hypotf
-
hypot() 函数的别名
INFINITY
-
INFINITY 常量
isfinitef
-
isfinite() 函数的别名
isinff
-
isinf() 函数的别名
isnanf
-
isnan() 函数的别名
ldexpf
-
ldexp() 函数的别名
log10f
-
log10() 函数的别名
logf
-
log() 函数的别名
lrintf
-
lrint() 函数的别名
lroundf
-
lround() 函数的别名
库函数
math.h 头文件中定义了以下函数:
以下是 math.h 头文件中定义的函数列表:
序号
库函数和描述
1
double acos (double __x)
acos() 函数计算 __x 的反余弦的主值。返回值的范围是 [0, pi] 弧度。对于不在范围 [-1, +1] 内的参数,会发生域错误。
2
double asin (double __x)
asin() 函数计算 __x 的反正弦的主值。返回值的范围是 [-pi/2, pi/2] 弧度。对于不在范围 [-1, +1] 内的参数,会发生域错误。
3
double atan (double __x)
atan() 函数计算 __x 的反正切的主值。返回值的范围是 [-pi/2, pi/2] 弧度。
4
double atan2 (double __y, double __x)
atan2() 函数计算 __y / __x 的反正切的主值,使用两个参数的符号来确定返回值的象限。返回值的范围是 [-pi, +pi] 弧度。
5
double cbrt (double __x)
cbrt() 函数返回 __x 的立方根。
6
double ceil (double __x)
ceil() 函数返回大于或等于 __x 的最小整数值,表示为浮点数。
7
static double copysign (double __x, double __y)
copysign() 函数返回 __x,但带有 __y 的符号。即使 __x 或 __y 为 NaN 或零,它们也能工作。
8
double cos(double __x)
cos() 函数返回 __x 的余弦值,以弧度为单位。
9
double cosh (double __x)
cosh() 函数返回 __x 的双曲余弦。
10
double exp (double __x)
exp() 函数返回 __x 的指数值。
11
double fabs (double __x)
fabs() 函数计算浮点数 __x 的绝对值。
12
double fdim (double __x, double __y)
fdim() 函数返回 max(__x - __y, 0)。如果 __x 或 __y 或两者都是 NaN,则返回 NaN。
13
double floor (double __x)
floor() 函数返回小于或等于 __x 的最大整数值,表示为浮点数。
14
double fma (double __x, double __y, double __z)
fma() 函数执行浮点乘加运算。这是操作 (__x * __y) + __z,但中间结果不会舍入到目标类型。这有时可以提高计算的精度。
15
double fmax (double __x, double __y)
fmax() 函数返回两个值 __x 和 __y 中较大的一个。如果一个参数是 NaN,则返回另一个参数。如果两个参数都是 NaN,则返回 NaN。
16
double fmin (double __x, double __y)
fmin() 函数返回两个值 __x 和 __y 中较小的一个。如果一个参数是 NaN,则返回另一个参数。如果两个参数都是 NaN,则返回 NaN。
17
double fmod (double __x, double__y)
fmod() 函数返回 __x / __y 的浮点余数。
18
double frexp (double __x, int * __pexp)
frexp() 函数将浮点数分解为标准化分数和 2 的整数幂。它将整数存储在 __pexp 指向的 int 对象中。如果 __x 是一个正常的浮点数,frexp() 函数返回的值 v,使得 v 的大小在区间 [1/2, 1) 或零内,并且 __x 等于 v 乘以 2 的 __pexp 次幂。如果 __x 为零,则结果的两部分都为零。如果 __x 不是有限数,则 frexp() 返回 __x 本身,并通过 __pexp 存储 0。
注意 - 此实现允许零指针作为指令来跳过存储指数。
19
double hypot (double __x, double__y)
hypot() 函数返回 sqrt(__x*__x + __y*__y)。这是边长为 __x 和 __y 的直角三角形的斜边长度,或者点 (__x, __y) 到原点的距离。最好使用此函数而不是直接公式,因为误差要小得多。__x 和 __y 小的时候不会下溢。如果结果在范围内,则不会上溢。
20
static int isfinite (double __x)
isfinite() 函数如果 __x 是有限的:不是正无穷大或负无穷大,也不是 NaN ,则返回非零值。
21
int isinf (double __x)
isinf() 函数如果参数 __x 是正无穷大,则返回 1;如果 __x 是负无穷大,则返回 -1;否则返回 0。
注意 - GCC 4.3 可以用内联代码替换此函数,该代码对正负无穷大都返回 1 值(gcc bug #35509)。
22
int isnan (double __x)
isnan() 函数如果参数 __x 表示“非数字”(NaN )对象,则返回 1,否则返回 0。
23
double ldexp (double __x, int __exp )
ldexp() 函数将浮点数乘以 2 的整数幂。它返回 __x 乘以 2 的 __exp 次幂的值。
24
double log (double __x)
log() 函数返回参数 __x 的自然对数。
25
double log10(double __x)
log10() 函数返回参数 __x 以 10 为底的对数。
26
long lrint (double __x)
lrint() 函数将 __x 四舍五入到最接近的整数,其中四舍五入到偶数方向。(也就是说,1.5 和 2.5 都四舍五入到 2)。此函数类似于 rint() 函数,但返回值类型不同,并且可能发生溢出。
返回值
四舍五入后的长整数。如果 __x 不是有限数或发生溢出,则此实现返回 LONG_MIN 值 (0x80000000)。
27
long lround (double __x)
lround() 函数将 __x 四舍五入到最接近的整数,但将四舍五入的情况远离零(而不是四舍五入到最接近的偶数)。此函数类似于 round() 函数,但返回值类型不同,并且可能发生溢出。
返回值
四舍五入后的长整数。如果 __x 不是有限数或发生溢出,则此实现返回 LONG_MIN 值 (0x80000000)。
28
double modf (double __x, double * __iptr )
modf() 函数将参数 __x 分解为整数部分和小数部分,两者都与参数具有相同的符号。它将整数部分作为双精度浮点数存储在 __iptr 指向的对象中。
modf() 函数返回 __x 的带符号小数部分。
注意 − 此实现跳过通过零指针写入。但是,GCC 4.3 可以用内联代码替换此函数,该内联代码不允许使用 NULL 地址来避免存储。
29
float modff (float __x, float * __iptr)
modf() 的别名。
30
double pow (double __x, double __y)
pow() 函数返回 __x 的 __y 次幂的值。
31
double round (double __x)
round() 函数将 __x 四舍五入到最接近的整数,但将四舍五入的情况远离零(而不是四舍五入到最接近的偶数)。不可能发生溢出。
返回值
四舍五入后的值。如果 __x 是整数或无穷大,则返回 __x 本身。如果 __x 是 NaN ,则返回 NaN 。
32
int signbit (double __x)
signbit() 函数如果 __x 的值设置了其符号位,则返回非零值。这与 `__x < 0.0` 不同,因为 IEEE 754 浮点数允许零带符号。比较 `-0.0 < 0.0` 为假,但 `signbit (-0.0)` 将返回非零值。
33
double sin (double __x)
sin() 函数返回 __x 的正弦值,以弧度为单位。
34
double sinh (double __x)
sinh() 函数返回 __x 的双曲正弦值。
35
double sqrt (double __x)
sqrt() 函数返回 __x 的非负平方根。
36
double square (double __x)
square() 函数返回 __x * __x。
注意 − 此函数不属于 C 标准定义。
37
double tan (double __x)
tan() 函数返回 __x 的正切值,以弧度为单位。
38
double tanh ( double __x)
tanh() 函数返回 __x 的双曲正切值。
39
double trunc (double __x)
trunc() 函数将 __x 四舍五入到绝对值不大的最接近整数。
示例
以下示例演示如何使用最常见的 math.h 库函数 −
double double__x = 45.45 ;
double double__y = 30.20 ;
void setup() {
Serial.begin(9600);
Serial.print("cos num = ");
Serial.println (cos (double__x) ); // returns cosine of x
Serial.print("absolute value of num = ");
Serial.println (fabs (double__x) ); // absolute value of a float
Serial.print("floating point modulo = ");
Serial.println (fmod (double__x, double__y)); // floating point modulo
Serial.print("sine of num = ");
Serial.println (sin (double__x) ) ;// returns sine of x
Serial.print("square root of num : ");
Serial.println ( sqrt (double__x) );// returns square root of x
Serial.print("tangent of num : ");
Serial.println ( tan (double__x) ); // returns tangent of x
Serial.print("exponential value of num : ");
Serial.println ( exp (double__x) ); // function returns the exponential value of x.
Serial.print("cos num : ");
Serial.println (atan (double__x) ); // arc tangent of x
Serial.print("tangent of num : ");
Serial.println (atan2 (double__y, double__x) );// arc tangent of y/x
Serial.print("arc tangent of num : ");
Serial.println (log (double__x) ) ; // natural logarithm of x
Serial.print("cos num : ");
Serial.println ( log10 (double__x)); // logarithm of x to base 10.
Serial.print("logarithm of num to base 10 : ");
Serial.println (pow (double__x, double__y) );// x to power of y
Serial.print("power of num : ");
Serial.println (square (double__x)); // square of x
}
void loop() {
}
结果
cos num = 0.10
absolute value of num = 45.45
floating point modulo =15.25
sine of num = 0.99
square root of num : 6.74
tangent of num : 9.67
exponential value of num : ovf
cos num : 1.55
tangent of num : 0.59
arc tangent of num : 3.82
cos num : 1.66
logarithm of num to base 10 : inf
power of num : 2065.70