Arduino - 数学图书馆( Math Library)
Arduino Math库(math.h)包含许多用于处理浮点数的有用数学函数。
Library宏 (Library Macros)
以下是头部math.h中定义的宏 -
宏 | 值 | 描述 |
---|---|---|
M_E | 2.7182818284590452354 | The constant 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 */ | The constant 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 constant |
isfinitef | - | isfinite()函数的别名 |
isinff | - | isinf()函数的别名 |
isnanf | - | isnan()函数的别名 |
ldexpf | - | ldexp()函数的别名 |
log10f | - | log10()函数的别名 |
logf | - | log()函数的别名 |
lrintf | - | lrint()函数的别名 |
lroundf | - | lround()函数的别名 |
Library 函数
标题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并按__pexp存储0。 Note - 此实现允许零指针作为指令跳过存储指数。 |
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。 Note - 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()函数,但它的返回值类型不同,并且可以溢出。 Returns 舍入的长整数值。 如果__x不是有限数或溢出,则此实现返回LONG_MIN值(0x80000000)。 |
27 | long lround (double __x) lround()函数将__x舍入到最接近的整数,但是将中间情况舍入为零(而不是最近的偶数整数)。 此函数类似于round()函数,但它的返回值类型不同,并且可能出现溢出。 Returns 舍入的长整数值。 如果__x不是有限数或溢出,则此实现返回LONG_MIN值(0x80000000)。 |
28 | double modf (double __x, double * __iptr ) modf()函数将参数__x分解为整数和小数部分,每个部分都与参数具有相同的符号。 它将整数部分存储为__iptr指向的对象中的double。 modf()函数返回__x的带符号小数部分。 Note - 该实现跳过零指针写入。 但是,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舍入到最接近的整数,但是将中间情况舍入为零(而不是最接近的偶数整数)。 溢出是不可能的。 Returns 舍入的值。 如果__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。 Note - 此函数不属于C标准定义。 |
37 | double tan (double __x) tan()函数返回__x的正切值,以弧度为单位。 |
38 | double tanh ( double __x) tanh()函数返回__x的双曲正切值。 |
39 | double trunc (double __x) trunc()函数将__x舍入为绝对值不大的最接近的整数。 |
例子 (Example)
以下示例显示如何使用最常见的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() {
}
结果 (Result)
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