B.4  浮点数转换字符串函数

附录 部分C函数库详解

使用C语言的价值在于使用其标准函数。在解决实际问题时,能方便地操作字符串和文件等对象是非常重要的。几乎没有哪种计算机语言能像C语言那样能出色地完成全部工作。C函数库目前没有图形函数,没有全屏幕文本操作函数,信号机制相当弱,并且根本没有多任务机制和没有提供常规内存之外的内存支持。尽管C语言有上述缺陷,但它为所有程序提供了一套基本功能,无论是多任务、多窗口,还是其他更复杂的环境。C函数库的缺陷在编译程序开发商和第三方函数库得到弥补。总而言之,C函数库为程序设计提供了非常坚实的基础。

函数库的优点包括准确性、高效性和可移植性。编译程序的开发商在函数库出厂之前肯定做了全面的检测和测试,可以保证函数库的准确性。优秀的C程序员会大量使用标准函数库,所以如果编译程序的开发商能够提供一套出色的标准函数,就会在竞争中占优势。

每一个库函数,都需要一个对应的头文件。这个头文件提供该函数的原型。只有在源程序的开始部分包含了该头文件之后,该函数才可以被使用;否则,程序编译时该函数无法被识别。

附录A 数学函数

头文件<math.h>声明了两种数据类型:数学函数和宏。两个数据类型分别为:float_t和double_t。这两个数据类型至少和float类型及double类型占用相同的字节。并且,double_t类型至少要和float_t类型同等宽度。如果宏FLT_EVAL_METHOD等于0,float_t类型相当于float类型,double_t类型相当于double类型;如果宏FLT_EVAL_METHOD等于1,float_t类型和double_t类型都相当于double类型;如果宏FLT_EVAL_METHOD等于2,float_t类型和double_t类型都相当于long double类型。FLT_EVAL_METHOD等于其他值的情况至今还没有定义。

函数库中的函数原型均有3种:double、float和long double。此处只讲述double类型,对于其余类型,只要进行相应的替换即可。

A.1 数学函数库中的宏

数学函数库包含了一部分宏。常见的宏如下:

HUGE_VAL——表示正的double常量,代表正的无穷大。

HUGE_VALF——表示浮点类型的正值无穷大。

HUGE_VALL——表示longdouble类型的正的无穷大。

INFINITY——表示浮点类型(float)正的无穷大。

NAN——表示无效数字,即不是一个数。

FP_INFINITE——表示浮点类型的无穷大。

FP_NAN——表示无效数据。

FP_NORAMAL——表示正常状态。

FP_SUBNORMAL——表示异常状态。

FP_ZERO——表示浮点类型的0。

FP_FAST_FMA——表示和fma()函数同样的效果。

FP_FAST_FMAF——表示浮点类型的FP_FAST_FMA。

FP_FAST_FMAL——表示longdouble类型的FP_FAST_FMA。

FP_ILOGB0——表示ilogb(x)函数的x参数为0时,函数的返回值。

FP_ILOGBNAN——表示ilogb(x)函数的x参数为NAN时,函数的返回值。

MATH_ERRNO——表示数学错误,整数1。

MATH_ERREXCEPT——表示数学异常错误,整数2。

A.2 浮点计算减法协议开关

在进行浮点计算时,FP_CONTRACT宏可以用来判断是否发生减法运算。因为浮点数计算在计算机语言的底层是一个非常复杂的过程,如果处理不当会造成计算结果偏差。常见的用法:

978-7-111-51399-5-Chapter18-1.jpg

FP_CONTRACT默认是on状态,其用法如下:

978-7-111-51399-5-Chapter18-2.jpg

A.3 数学库中的宏函数

C语言的数学函数库还包含部分宏函数,主要有fpclassify()、isfinite()、isinf()、isnan()、isnormal()和signbit()。使用这些宏函数时,必须包含头文件<math.h>。

•fpclassify(float x)函数返回值是一个分类宏,用于说明参数x的类型。

•isfinite(float x)函数用于判断参数x是否是一个有限的值。当且仅当参数x是一个有限的值时,函数返回值是一个非零数。

•isinf(float x)函数用于判断参数x是否是无限的数。当且仅当参数x是一个无限的数时,函数返回一个非零数。

•isnan(float x)函数用于判断参数x是否是NAN。当且仅当参数x是NAN时,函数返回一个非零数值。

•isnormal(float x)函数用于判断参数x是否是一个正常的数值。当且仅当参数x是一个正常的数值时,函数返回一个非零数值。

•signbit(float x)函数用于判断参数x是否是一个有符号数(即负数)。当且仅当参数x是一个负数时,函数返回一个非零值。

A.4 三角函数和反三角函数

C语言函数库提供了一系列的三角函数,主要有acos()、asin()、atan()、atan2()、cos()、sin()、tan()、acosh()、asinh()、cosh()、sinh()和tanh()。使用这些函数时,需要包含头文件<math.h>。

1)三角余弦函数:double cos(double x)。

说明:参数x是弧度数值。

2)三角正选函数:double sin(double x)。

说明:参数x是弧度数值。

3)三角正切函数:double tan(double x)。

说明:参数x是弧度数值。

4)反余弦函数:doublea cos(double x)。

说明:参数x是[-1,1]内的实数,函数返回值是在[0,π]的实数。如果参数x超出了[-1,1],函数调用时将发生错误。

5)反正弦函数:double asin(double x)。

说明:参数x是[-1,1]内的实数,函数返回值是在[-π/2,π/2]的实数。如果参数x超出[-1,1],函数调用时将发生错误。

6)反正切函数:double atan(doublex)和double atan2(double y,double x)。

说明:这两个函数的返回值是在[-π/2,π/2]的实数。函数atan2(double y,double x)的功能是计算y/x的反正切值,如果两个参数均为0,函数调用时将发生错误。

7)双曲余弦函数:doubl ecosh(double x)。

说明:如果参数x的值特别大,函数调用时会发生错误。

8)双曲正弦函数:double sinh(double x)。

说明:如果参数x的值特别大,函数调用时会发生错误。

9)双曲正切函数:double tanh(double x)。

说明:该函数用于计算双曲正切函数的值。

10)反双曲余弦函数:double acosh(double x)。

说明:函数返回值在[0,∞]。如果参数x小于1,函数调用时将发生错误。Turbo C2.0的数学函数库没有提供本函数。

11)反双曲正弦函数:double asinh(double x)。

说明:该函数用于计算反双曲正弦函数的值。TurboC2.0的数学函数库没有提供本函数。

12)反双曲正切函数:double atanh(double x)。

说明:参数x必须在范围(-1,+1)内。TurboC2.0的数学函数库没有提供本函数。

例A-1

978-7-111-51399-5-Chapter18-3.jpg

例A-1的执行效果如图A-1所示。

978-7-111-51399-5-Chapter18-4.jpg

图A-1 例A-1的执行效果

A.5 指数和对数函数

1.指数函数

C语言数学函数库中的指数函数包括exp()、exp2()、expm1()、frexp()和ldexp()。TurboC2.0没有提供exp2()和expm1()。

1)exp()函数的原型为:

978-7-111-51399-5-Chapter18-5.jpg

说明:该函数用于计算指数ex的值。其浮点类型的函数形式为expf(),长双精度型的函数原型为expl()。如果参数x的值太大,函数调用时可能发生错误。

2)frexp()函数的原型为:

978-7-111-51399-5-Chapter18-6.jpg

说明:该函数用于将双精度类型的实数value表示成x∗2∗exp的形式。如果参数value不是浮点数,函数的返回结果是不确定的。否则,函数返回值就是x的值,∗exp将返回一个整数值。如果函数调用成功,x是在[1/2,1)内的数值,也有可能是0。如果参数value为0,函数返回值和(exp)都是零。如果参数x的值太大,函数调用时可能发生错误。

3)ldexp()函数的原型为:

978-7-111-51399-5-Chapter18-7.jpg

说明:该函数用于求解表达式(x2exp)的值。如果参数比较大,有可能调用时由于计算结果太大,导致数值溢出。

4)exp2()函数的原型为:

978-7-111-51399-5-Chapter18-8.jpg

说明:该函数用于计算指数2x的值。如果参数x的值太大,函数调用时可能发生错误。

5)函数expm1的原型为:

978-7-111-51399-5-Chapter18-9.jpg

说明:该函数用于计算表达式(ex-1)的值。如果参数x的值太大,函数调用时可能发生错误。

2.对数函数

数学函数库中的对数函数主要包括ilogb()、logb()、log()、log10()、loglp()、log2()、modf()、scalbn()和scalbln()。其中,Turbo C 2.0的函数库中没有提供ilogb()、logb()、loglp()、log2()、scalbn()和scalbln()。

1)ilogb()函数的原型为intilogb(double x);

说明:该函数和logb()函数差不多,只不过功能更完善。如果参数x等于0,函数调用时参数x自动转换为FP_ILOGB0;如果x是无限数,函数调用时参数x自动转换为INT_MAX;如果x是NAN,函数调用时参数x自动转换为FP_ILOGBNAN;其他情况时,就相当于调用函数logb()。注意:函数返回值是整数,具有自动取整的功能。如果x等于0,函数调用时有可能发生错误。

2)logb()函数的原型为:

978-7-111-51399-5-Chapter18-10.jpg

说明:在调用logb(x)函数时,假定返回值是y,存在指数函数关系x=2y,在表达式中,x即和logb()参数x一致,logb(x)的返回值即是y。如果参数x等于零,函数调用时会发生错误。

3)log()函数的原型为

978-7-111-51399-5-Chapter18-11.jpg

说明:该函数是以e为底的自然对数,返回值是表达式(logxe)的值。参数x为零时,函数调用时会发生错误。

4)log10()函数的原型为

978-7-111-51399-5-Chapter18-12.jpg

说明:该函数是以10为底的对数计算。如果参数x为0,函数调用时会发生错误。

5)loglp()函数的原型为

978-7-111-51399-5-Chapter18-13.jpg

说明:该函数用于计算表达式(loge(1+x)的值。如果参数为-1,函数调用时会发生错误。

6)log2()函数的原型为

978-7-111-51399-5-Chapter18-14.jpg

说明:该函数是以2为底的对数计算。如果参数x为0,函数调用时会发生错误。

7)modf()函数的原型为

978-7-111-51399-5-Chapter18-15.jpg

说明:对于浮点数value,函数调用结束后,浮点数的整数部分保留在(iptr)中,函数的返回值是浮点数的小数部分。

例A-2

978-7-111-51399-5-Chapter18-16.jpg

例A-2的执行效果如图A-2所示

978-7-111-51399-5-Chapter18-17.jpg

图A-2 例A-2的执行效果

A.6 幂函数和绝对值函数

C语言数学函数库中的幂函数主要有cbrt()、hypot()、pow()和sqrt();绝对值函数主要有fabs()。其中,Turbo C 2.0没有提供函数cbrt()。

1.常见的幂函数

1)cbrt()函数的原型为

978-7-111-51399-5-Chapter18-18.jpg

说明:该函数用于求解参数x的立方根。

2)hypot()函数的原型为

978-7-111-51399-5-Chapter18-19.jpg

说明:该函数用于求解表达式(x2+y2)的值。

3)pow()函数的原型为

978-7-111-51399-5-Chapter18-20.jpg

说明:该函数用于求解表达式(xy)的值。如果x为负数,并且y不是整数,函数调用时会发生错误;如果x等于0,并且y小于或者等于0,函数调用时会发生错误。

4)sqrt()函数的原型为

978-7-111-51399-5-Chapter18-21.jpg

说明:该函数用于求解参数x的非负平方根。参数x必须是非负数,函数返回值是x的非负平方根。

2.绝对值函数

fabs()函数的原型为

978-7-111-51399-5-Chapter18-22.jpg

说明:该函数用于计算浮点数x的绝对值。

例A-3

978-7-111-51399-5-Chapter18-23.jpg

978-7-111-51399-5-Chapter18-24.jpg

例A-3的执行效果如图A-3所示。

978-7-111-51399-5-Chapter18-25.jpg

图A-3 例A-3的执行效果

A.7 误差和gamma函数

C语言数学函数库还提供了一套误差函数和gamma函数。误差函数主要有erf()和erfc()。gamma函数主要有lgamma()和tgamma()。TurboC2.0没有提供这4个函数。

1.误差函数

1)erf()函数的原型为

978-7-111-51399-5-Chapter18-26.jpg

说明:该函数用于计算表达式978-7-111-51399-5-Chapter18-27.jpg的值。

2)erfc()函数的原型为

978-7-111-51399-5-Chapter18-28.jpg

说明:该函数的返回值等于表达式(1-erf(x))的值。

2.gamma函数

1)lgamma()函数的原型为

978-7-111-51399-5-Chapter18-29.jpg

说明:该函数用于求解表达式(logeΓ(x))的值。如果参数x的值太大,函数调用时会发生错误;如果参数x的小于或等于0,函数调用时也会发生错误。

2)tgamma()函数的原型为

978-7-111-51399-5-Chapter18-30.jpg

说明:该函数用于求解表达式(Γ(x))的值。其余同lgamma()函数。

A.8 近似取整函数

C语言数学函数库还提供了一系列的近似取整函数,主要包括ceil()、floor()、nearby-int()、rint()、lrint()、llrint()、round()、lround()、llround()和trunc()。Turbo C 2.0仅提供了ceil()和floor()。

1)ceil()函数的原型为

978-7-111-51399-5-Chapter18-31.jpg

说明:该函数用于计算不小于x的最小整数值。

2)floor()函数的原型为

978-7-111-51399-5-Chapter18-32.jpg

说明:该函数用于计算不大于参数x的最大整数值。

3)nearbyint()函数的原型为

978-7-111-51399-5-Chapter18-33.jpg

说明:该函数用于利用“四舍五入”原则,求出距离参数x最近的整数值。

4)rint()函数的原型为

978-7-111-51399-5-Chapter18-34.jpg

说明:该函数的功能是实现四舍五入取整。

函数lrint()和llrint()与函数rint()相仿。

5)round()函数的原型为

978-7-111-51399-5-Chapter18-35.jpg

说明:利用四舍五入原则,结果为整数。

lround()函数和llrround()函数与round()函数基本一致。

例A-4

978-7-111-51399-5-Chapter18-36.jpg

例A-4的执行效果如图A-4所示。

978-7-111-51399-5-Chapter18-37.jpg

图A-4 例A-4的执行效果

A.9 求余函数

C语言数学函数库提供了3个求余函数,它们分别是fmod()、remainder()和remquo()。Turbo C 2.0没有提供remquo()函数和remainder()。

1)fmod()函数的原型为

978-7-111-51399-5-Chapter18-38.jpg

说明:该函数用于求取表达式(x/y)的余数。

2)remainder()函数的原型为

978-7-111-51399-5-Chapter18-39.jpg

说明:该函数用于求取表达式(x/y)的余数。

3)remquo()函数的原型为:

978-7-111-51399-5-Chapter18-40.jpg

说明:remquo()和函数remainder()功能一样。二者的不同之处在于remquo()函数增加了1个整形指针类型的参数,一般不使用。

例A-5

978-7-111-51399-5-Chapter18-41.jpg

例A-5的执行效果如图A-5所示。

978-7-111-51399-5-Chapter18-42.jpg

图A-5 例A-5的执行效果

A.10 操作处理函数

C语言数学函数库中的操作处理函数包括copysign()、nan()、nextafter()和nexttoward()。Turbo C 2.0的函数库没有提供这4个函数。

1)copysign()函数的原型为

978-7-111-51399-5-Chapter18-43.jpg

说明:该函数用于将参数y的符号赋予参数x,函数返回值的大小和x的绝对值一致,符号和参数y的符号一致。如果参数x是NaN,返回值即为NaN。

2)nan()函数的原型为

978-7-111-51399-5-Chapter18-44.jpg

说明:该函数的返回值为NaN。

3)nextafter()函数的原型为

978-7-111-51399-5-Chapter18-45.jpg

说明:该函数用于返回参数x在参数y方向上可以表示的最接近的数值,若x等于y,则返回x。例如,

978-7-111-51399-5-Chapter18-46.jpg

4)nexttoward()函数的原型为

978-7-111-51399-5-Chapter18-47.jpg

说明:该函数的功能和nextafter()函数相同;如果x等于y时,函数返回值等于y。

A.11 最大值最小值和正差函数

C语言数学函数库中的最大值、最小值和正差函数分别为fmax()、fmin()和fdim()。Turbo C 2.0没有提供这3个函数。

1)fdim()函数的原型为

978-7-111-51399-5-Chapter18-48.jpg

说明:该函数用于判断两个参数的差是否为正值,如果为正值,函数返回值即为该差值;如果两个参数之差为负值,函数返回值为0。

2)fmax()函数的原型为

978-7-111-51399-5-Chapter18-49.jpg

说明:该函数用于返回两个参数中较大的那个参数的值。

3)fmin()函数的原型为

978-7-111-51399-5-Chapter18-50.jpg

说明:该函数用于返回两个参数中较小的那个参数的值。

A.12 浮点乘加函数

C语言数学函数库包含了一个浮点乘加fma()函数。TurboC2.0未提供本函数。

函数原型为

978-7-111-51399-5-Chapter18-51.jpg

说明:该函数用于计算表达式(x∗y+z)的值。本函数是一个完全的三重运算。

A.13 比较函数(宏)

C语言数学函数库还提供了一系列的比较宏函数。例如,isgreater()、isgreaterequal()、isless()、islessequal()、islessgreater()和isunordered()。这些函数的原型分别为:

978-7-111-51399-5-Chapter18-52.jpg

Turbo C 2.0没有提供以上函数,但提供了相似的功能函数,例如,isEqual()、isLessT-han()、islower()等函数。

附录B 数据类型转换

C语言函数库提供了一套数据类型转换函数,大致分为4类atoi()、atof()和atol();itoa()、ltoa()和ultoa();fcvt()、ecvt()和gcvt()。

B.1 字符转整数函数(atoi()和atol())

atoi()函数属于C标准库,使用时需要包含头文件<stdlib.h>。其原型为:

int atoi(constchar* str);

说明:该函数用于将字符串str转换成一个整数,并返回结果。参数str以数字开头,当函数从str中读到非数字字符时会结束转换,并将结果返回。

atol()函数的使用方法基本上和atoi()相似。

例B-1

978-7-111-51399-5-Chapter18-53.jpg

例B-1的执行效果为:

978-7-111-51399-5-Chapter18-54.jpg

B.2 字符型转换浮点型函数(atof()和atol())

atol()函数的原型为:

978-7-111-51399-5-Chapter18-55.jpg

atof()函数的原型为:

978-7-111-51399-5-Chapter18-56.jpg

说明:该函数用于将字符串str转换成一个双精度数值,并返回结果。参数str必须以有效数字开头,允许以“E”或“e”除外的任意非数字字符结尾。

例B-2

978-7-111-51399-5-Chapter18-57.jpg

例B-2的执行效果为:

978-7-111-51399-5-Chapter18-58.jpg

B.3 整型数转字符串函数(itoa()、ltoa()和ultoa())

itoa()函数的原型为:

978-7-111-51399-5-Chapter18-59.jpg

参数value是被转换的整数,string是转换后储存的字符数组,radix是转换进制(2,8,10,16)。

978-7-111-51399-5-Chapter18-60.jpg

参数value是长整型数值,str是value转换而来的字符串,radix是转换进制(2-36)。

978-7-111-51399-5-Chapter18-61.jpg

参数value是要转换的数值,str用于存储转换的结果,radix是转换进制(2-36)。

例B-3

978-7-111-51399-5-Chapter18-62.jpg

例B-3的执行效果为:

978-7-111-51399-5-Chapter18-63.jpg

B.4 浮点数转换字符串函数

浮点数转换字符串各函数的原型为:

978-7-111-51399-5-Chapter18-64.jpg

说明:fcvt()函数用于转换浮点数为字符串。

978-7-111-51399-5-Chapter18-65.jpg

说明:ecvt()函数用于转换双精度浮点型数为字符串,转换结果中不包括十进制小数点。

978-7-111-51399-5-Chapter18-66.jpg

说明:gcvt()函数用于将浮点数转换成字符串,同时返回一个指向字符串的存储位置的指针。

例B-4

978-7-111-51399-5-Chapter18-67.jpg

例B-4的执行效果为:

978-7-111-51399-5-Chapter18-68.jpg

978-7-111-51399-5-Chapter19-1.jpg

为中华崛起传播智慧

地址:北京市百万庄大街22号

邮政编码:100037

电话服务

服务咨询热线:010-88361066

读者购书热线:010-68326294

010-88379203

网络服务

机工官网:www.cmpbook.com

机工官博:weibo.com/cmp1952

盒书网:www.golden-book.com

教育服务网:www.cmpedu.com

封面无防伪标均为盗版

策划编辑◎申永刚/封面设计◎马精明