Arduino 数学库

Arduino数学库(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 无穷大常量。
isfinitef isfinite()函数的别名。
isinff isinf()函数的别名。
isnanf isnan()函数的别名。
ldexpf ldexp()函数的别名。
log10f log10()函数的别名。
logf log()函数的别名。
lrintf lrint()函数的别名。
lroundf lround()函数的别名。

库函数

以下函数在标题 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()返回e的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)

如果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四舍五入到最近的整数,但中间情况不舍入到0(不是到最近的偶数整数)。这个函数类似于round()函数,但是它的返回值的类型是不同的,并且有可能溢出。

返回

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

28

double modf (double __x, double * __iptr )

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

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四舍五入到最近的整数,但中间情况不舍入到0(不是到最近的偶数整数)。不可能会溢出。

返回

四舍五入的值。如果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) );

// returns cosine of x
  
  Serial.print("

absolute value of
num = "

);

 
  
  Serial.println (fabs (double__x) );

// absolute value of afloat
  
  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.45floating 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