C语言从头学58——学习头文件math.h(一)

math.h 头文件提供了很多数学计算方面的函数。

一、使用数学函数前需要了解的两个类型、两个宏

1、float_t:当前系统能够有效执行float运算的类型,宽度不少于float。

2、double_t:当前系统能够有效执行double运算的类型,宽度不少于double。

(使用系统的float_t、double_t的宽度见例子)

3、INFINITY:该宏表示正无穷(表示计算出来的结果太大无法显示)

4、NAN :该宏表示非数字(表示计算出来的结果不能用数字表示)

二、数学函数计算过程中发生错误时报错类型方式:

Range errors:函数返回类型无法表示运算结果

Domain errors:函数参数错误

Pole errors:参数导致函数的极限值变成无限

Overflow errors:运算结果太大向上溢出

Underflow errors:运算结果太小向下溢出

三、判断参数是否存在错误的几个函数

1、fpclassify(参1);

参数: 参1:int、float、double等类型的值或表达式

返回值:

a.当参数(值或表达式)为正无穷大或负无穷大时返回FP_INFINITE

b.当参数不是数字时返回FP_NAN

c.当参数为零时返回FP_ZERO

d.当参数为正或负非正常值时返回FP_SUBNORMAL

e.当参数为非零的、正常值时返回FP_NORMAL

2、isfinite(参1);

参数:参1:int、float、double等类型的值或表达式

返回值:如果参数不是无限或 NAN,返回1(真),否则返回0。

3、isinf(参1);

参数:参1:int、float、double等类型的值或表达式

返回值:如果参数是正无穷或负无穷,返回1(真),否则返回0。

4、isnan(参1);

参数:参1:int、float、double等类型的值或表达式

返回值:如果参数不是数字,返回1(真),否则返回0。

5、isnormal(参1);

参数:参1:int、float、double等类型的值或表达式

返回值:如果参数是正常数字,返回1(真),否则返回0。

说明:

a.使用以上一个或几个函数特别是第1个函数,对数学函数的参数进行一下检验,再正式

调用数学函数,可以避免出现计算错误。

b.现在的编译器很聪明,等不到程序发现错误编译器就提前发现了。

6、signbit(参1);

参数:参1:int、float、double等类型的值或表达式

返回值:如果参数为负值返回非0数,否则返回0。

四、很多数学函数的返回值是 double 类型,但是同时提供 float 类型与long double类型的版本,这种版本就是在函数名后边加上f或者l,函数是否有这种版本,一试便知。acos()函数,还同时存在acosf()和acosl()。

五、验证程序:

cpp 复制代码
#include<stdio.h>
#include<math.h>
char* myFpclassify(double x)
{
    switch (fpclassify(x)) {
    case FP_INFINITE:
        return "参数为正无穷大或符无穷大";
        break;
    case FP_NAN:
        return "参数不是数字\n";
        break;
    case FP_ZERO:
        return "参数是零";
        break;
    case FP_SUBNORMAL:
        return "参数不是正常数字";
        break;
    case FP_NORMAL:
        return "参数是正常数字";
        break;
    default:
        return "参数无法判断";
    }
}
int main()
{ 

//float_t、double_t的宽度
    printf("float_t sizeof:%d\n", (int)sizeof(float_t));//运行结果:float_t sizeof:4
    printf("float sizeof:%d\n", (int)sizeof(float));//运行结果:float sizeof:4
    printf("double_t sizeof:%d\n", (int)sizeof(double_t));//运行结果:double_t sizeof:8
    printf("double sizeof:%d\n", (int)sizeof(double));//运行结果:double sizeof:8
    printf("INFINITY:%f\n", INFINITY);//运行结果:INFINITY:inf
    printf("NAN:%f\n", NAN); //运行结果:NAN:nan
//实验fpclassify函数
    char* s = myFpclassify(1.0 / 1.2e300); //运行结果:参数是正常数字
    printf("%s\n", s);
    s = myFpclassify(0.0 / 1.2e300); //运行结果:参数是零
    printf("%s\n", s); 
//实验signbit函数
    printf("-3.14signbit:%d 3.14signbit:%d\n", signbit(-6.28), signbit(3.14));
                                     //运行结果: -3.14signbit:32768 3.14signbit:0
//数学函数版本
    printf("acos(0.145)=%.10f\n",acos(0.145));//运行结果:acos(0.145)=1.4252833543
    printf("acosf(0.145)=%.10f\n",acosf(0.145));//运行结果:acosf(0.145) = 1.4252833128
    printf("acosl(0.145)=%.10f\n",acosl(0.145));//运行结果:acosl(0.145) = 1.4252833543
 
    getchar();
    return 0;
}
相关推荐
一念&6 小时前
每日一个C语言知识:C 数据类型
c语言·开发语言
小秋学嵌入式-不读研版6 小时前
C49-函数指针(通过指针调用函数)
c语言·笔记
明天会有多晴朗8 小时前
C语言入门教程(第1讲):最通俗的C语言常见概念详解与实战讲解
c语言·开发语言·c++
迎風吹頭髮9 小时前
UNIX下C语言编程与实践40-UNIX 全局跳转:setjmp 与 longjmp 函数的使用与注意事项
java·c语言·unix
山,离天三尺三11 小时前
基于LINUX平台使用C语言实现MQTT协议连接华为云平台(IOT)(网络编程)
linux·c语言·开发语言·网络·物联网·算法·华为云
小年糕是糕手12 小时前
【数据结构】算法复杂度
c语言·开发语言·数据结构·学习·算法·leetcode·排序算法
明天会有多晴朗12 小时前
深度剖析 C++ 之内存管理篇
c语言·开发语言·c++
potato_may12 小时前
C语言第3讲:分支和循环(上)—— 程序的“决策”与“重复”之旅
c语言·开发语言
智者知已应修善业14 小时前
【51单片机32个灯,第一次亮1,2。第二次亮2,3。第三次亮3,4。。。。】2023-2-10
c语言·经验分享·笔记·嵌入式硬件·51单片机
无限进步_15 小时前
【C语言】寻找数组中唯一不重复的元素
c语言·开发语言·算法