Arduino - math 函数库

Arduino Math 库(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
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. Library Function & Description
1

double acos (double __x)

函数计算__x 的反余弦的主值。返回值的范围是[0,pi]弧度。不在[-1,+ 1]范围内的参数会报错误。

2

double asin (double __x)

函数计算__x 的反正弦的主值。返回值的范围是[-pi / 2,pi / 2]弧度。不在[-1,+ 1]范围内的参数发生域错误。

3

double atan (double __x)

函数计算__x 的反正切的主值。返回值的范围是[-pi / 2,pi / 2]弧度。

4

double atan2 (double __y, double __x)

atan2()函数计算__y / __x 的反正切的主值,使用两个参数的符号来确定返回值的象限。返回值的范围是[-pi,+ pi]弧度。

5

double cbrt (double __x)

函数返回__x 的立方根。

6

double ceil (double __x)

函数返回大于或等于__x 的最小整数值,表示为浮点数。

7

函数返回__x 但符号为__y。即使__x 或__y 为 NaN 或零,它们也能工作。

8

double cos(double __x)

函数返回__x 的余弦值,以弧度为单位。

9

double cosh (double __x)

函数返回__x 的双曲余弦值。

10

double exp (double __x)

函数返回__x 的指数值。

11

double fabs (double __x)

函数计算浮点数__x 的绝对值。

12

double fdim (double __x, double __y)

函数返回 max(__ x - __y,0)。如果__x 或__y 或两者都是 NaN,则返回 NaN。

13

double floor (double __x)

函数返回小于或等于最大积分值到__X,表示为浮点数。

14

double fma (double __x, double __y, double __z)

函数执行浮点乘法加法。这是操作(__X * __y)+ __z,但是中间结果不四舍五入到目的地类型。这有时可以提高计算的精度。

15

double fmax (double __x, double __y)

函数返回两个值__x 和__y 中较大的一个。如果参数是 NaN,则返回另一个参数。如果两个参数都是 NaN,则返回 NaN。

16

double fmin (double __x, double __y)

函数返回两个值__x 和__y 中较小的一个。如果参数是 NaN,则返回另一个参数。如果两个参数都是 NaN,则返回 NaN。

17

double fmod (double __x, double__y)

函数返回__x / __y 的浮点余数。

18

double frexp (double __x, int * __pexp)

函数将浮点数分解为标准化分数和 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)

函数返回 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 )

函数将浮点数乘以 2 的整数幂。它将__x 乘以 2 的值返回到幂__exp。

24

double log (double __x)

函数返回参数__x 的自然对数。

25

double log10(double __x)

函数将参数__x 的对数返回到基数 10。

26

long lrint (double __x)

函数将__x 舍入到最接近的整数,将中间情况四舍五入为偶数整数方向。(这是 1.5 和 2.5 的值都舍入为 2)。此函数类似于 rint()函数,但它的返回值类型不同,并且可以溢出。

返回

舍入的长整数值。如果__x 不是有限数或溢出,则此实现返回 LONG_MIN 值(0x80000000)。

27

long lround (double __x)

函数将__x 舍入到最接近的整数,但是将中间情况舍入为零(而不是最接近的偶数整数)。此函数类似于 round()函数,但它的返回值类型不同,并且可以溢出。

返回

舍入的长整数值。如果__x 不是有限数或溢出,则此实现返回 LONG_MIN 值(0x80000000)。

28

double modf (double __x, double * __iptr )

函数将参数__x 分解为整数和小数部分,每个部分都与参数具有相同的符号。它将整数部分存储为__iptr 指向的对象中的 double。

modf()函数返回__x 的带符号小数部分。

注 - 该实现跳过零指针写入。但是,GCC 4.3 可以使用内联代码替换此函数,该代码不允许使用 NULL 地址来避免存储。

29

float modff (float __x, float * __iptr)

modf()的别名。

30

double pow (double __x, double __y)

将__x 的值返回给指数__y。

31

double round (double __x)

函数将__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)

函数返回__x 的正弦值,以弧度为单位。

34

double sinh (double __x)

函数返回__x 的双曲正弦值。

35

double sqrt (double __x)

函数返回__x 的非负平方根。

36

double square (double __x)

函数 square()返回__x * __x。

注 - 此函数不属于 C 标准定义。

37

double tan (double __x)

函数返回__x 的正切值,以弧度为单位。

38

double tanh ( double __x)

函数返回__x 的双曲正切值。

39

double trunc (double __x)

函数将__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