Arduino - 数学库
Arduino 数学库 (math.h) 包含许多用于处理浮点数的有用数学函数。
库宏
以下是标头 math.h − 中定义的宏
宏 | 值 | 描述 |
---|---|---|
M_E | 2.7182818284590452354 | 常数 e。 |
M_LOG2E |
1.4426950408889634074 /* log_2 e */ |
以 2 为底的 e 的对数 |
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 */ |
以 10 为底的 e 的对数 |
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 −
S.No. | 库函数和说明 |
---|---|
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 并将 0 存储在 __pexp 中。 注意 −此实现允许使用零指针作为跳过存储指数的指令。 |
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) 如果 __x 是有限的,isfinite() 函数将返回非零值:不是正无穷或负无穷,也不是 NaN。 |
21 |
int isinf (double __x) 如果参数 __x 为正无穷,则函数 isinf() 返回 1,如果 __x 为负无穷,则返回 -1,否则返回 0。 注意 &减; GCC 4.3 可以用内联代码替换此函数,该代码为两个无穷大返回 1 值(gcc bug #35509)。 |
22 |
int isnan (double __x) 如果参数 __x 表示"非数字"(NaN) 对象,则函数 isnan() 返回 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) 如果 __x 的值的符号位已设置,则 signbit() 函数返回非零值。这与 `__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) ); // 返回 x 的余弦 Serial.print("num 的绝对值 = "); Serial.println (fabs (double__x) ); // 浮点的绝对值 Serial.print("浮点模数 = "); Serial.println (fmod (double__x, double__y)); // 浮点模数 Serial.print("num 的正弦 = "); Serial.println (sin (double__x) ) ;// 返回 x 的正弦 Serial.print("num 的平方根 : "); Serial.println ( sqrt (double__x) );// 返回 x 的平方根 Serial.print("num 的正切:"); Serial.println ( tan (double__x) ); // 返回 x 的正切 Serial.print("num 的指数值:"); Serial.println ( exp (double__x) ); // 函数返回 x 的指数值。 Serial.print("cos num :"); Serial.println (atan (double__x) ); // x 的反正切 Serial.print("num 的正切:"); Serial.println (atan2 (double__y, double__x) );// y/x 的反正切 Serial.print("num 的反正切:"); Serial.println (log (double__x) ) ; // x 的自然对数 Serial.print("cos num : "); Serial.println ( log10 (double__x)); // 以 10 为底的 x 的对数。 Serial.print("以 10 为底的 num 的对数 : "); Serial.println (pow (double__x, double__y) );// x 的 y 次方 Serial.print("num 的次方 : "); Serial.println (square (double__x)); // x 的平方 } void loop() { }
结果
cos num = 0.10 num 的绝对值 = 45.45 浮点模数 =15.25 num 的正弦 = 0.99 num 的平方根 : 6.74 num 的正切 : 9.67 num 的指数值 : ovf cos num : 1.55 num 的正切 : 0.59 num 的反正切 : 3.82 cos num : 1.66 以 10 为底的 num 的对数 : inf num 的次方 : 2065.70