【车载开发系列】C语言浮点数入门

【车载开发系列】C语言浮点数入门

C语言浮点数入门

  • 【车载开发系列】C语言浮点数入门
    • [一. 浮点数概念](#一. 浮点数概念)
    • [二. 内存占用](#二. 内存占用)
    • [三. 浮点数的输出](#三. 浮点数的输出)
    • [四. 与浮点数相关库函数](#四. 与浮点数相关库函数)
    • [五. 整数与浮点数转换](#五. 整数与浮点数转换)
    • [六. 科学记数法](#六. 科学记数法)

一. 浮点数概念

浮点数是计算机存储小数的一种方式,在C语言中,任何带小数点的数都被编译器解释为浮点数。C语言中采用float和double关键字来定义小数,其中float称为单精度浮点型,double称为双精度浮点型,long double更长的双精度浮点型。在任何区间内(如11.0 到 12.0 之间)都存在无穷多个实数,计算机的浮点数不能表示区间内所有的值。

二. 内存占用

float占用4个字节,能表达6-7位的有效数字,它不能用""来判断两个数字是否相等;
double占用8个字节,它能表达15-16位有效的数字,可以用""判断两个数字是否相等;

long double占用16个字节,它占用的内存是double的两倍,但表达数据的精度和double相同。

在实际开发中,如果没有特殊要求建议放弃使用float,只采用double就可以,long double暂时没有必要,但不知道以后的操作系统和编译器是否对long double有支持或者改进。

三. 浮点数的输出

float采用%f占位符;double采用%lf占位符;long double采用%Lf占位符,注意这里的L是大写。

不同的编译器可能会有差别,但double不可以用%f输入,只可以用%lf来输出。

四. 与浮点数相关库函数

C++ 复制代码
double atof(const char *nptr);       // 把字符串nptr转换为double
double fabs(double x);                // 求双精度实数x的绝对值
double pow(double x, double y);      // 求 x 的 y 次幂(次方)
double round(double x);               // double四舍五入
double ceil(double x);                // double向上取整数
double floor(double x);               // double向下取整数
double fmod(double x,double y);      // 求x/y整除后的双精度余数
// 把双精度val分解成整数部分和小数部分,整数部分存放在ip所指的变量中,返回小数部分。
double modf(double val,double *ip);

五. 整数与浮点数转换

在浮点数的取值范围内,整数转换为浮点数不会有精度的损失,但是浮点数转换为整数后,会丢弃小数位,所以为了不丢失精度,建议使用库函数round。

C++ 复制代码
#include <stdio.h>
 
int main()
{
  int ii=3;
  int jj=4;
  double dd;
 
  dd=ii;        // 可以
  printf("dd is %.2lf\n",dd); //dd is 3.00
 
  dd=ii/jj;     // 不行
  printf("dd is %.2lf\n",dd); //dd is 0.00
 
  dd=(double)ii/jj;  // 可以
  printf("dd is %.2lf\n",dd); //dd is 0.75
}

六. 科学记数法

不改变数的符号,只是改变数的书写形式,可以方便的表示日常生活中遇到的一些极大或极小的数 。如:光的速度大约是300,000,000米/秒;全世界人口数大约是:6,100,000,000,这样的数书写和显示都很不方便,为了免去写这么多重复的0,将其表现为这样的形式:6,100,000,000=6.1×10^9(10的九次方),即6.1E9或6.1e9。

科学计数法采用%e或%E输出,完整的输出格式是%m.ne或%m.nE,指定输出数据整数部分和小数部分共占m位,其中有n位是小数。如果数值长度小于m,则左端补空格,若数值长度大于m,则按实际位数输出。

复制代码
#include <stdio.h>
 int main()
 {  
 double dd;   
 dd=123000000;  printf("dd is  %.2e\n",dd);   
 dd=-123000000;  printf("dd is %.2e\n",dd);   
 dd=0.0000000123;  printf("dd is  %.2e\n",dd);   
 dd=-0.0000000123;  printf("dd is %.2e\n",dd);
 }

运行结果如下:

dd is 1.23e+008

dd is -1.23e+008

dd is 1.23e-008

dd is -1.23e-008

相关推荐
lanhuazui101 分钟前
C语言中指针+1得到什么值
c语言
爱编码的小八嘎7 分钟前
C语言完美演绎6-5
c语言
freshman_y15 分钟前
经典的C语言题型
c语言·开发语言·算法
small_wh1te_coder15 分钟前
拷打字节技术总监: 详解c语言嵌入式多线程编程中的头文件 #总结 上下篇合 #
c语言·开发语言·算法·操作系统·嵌入式
wangjialelele18 分钟前
现代C++:C++17新特性整理
c语言·开发语言·c++·visual studio code
蓝凌y35 分钟前
51单片机之花样灯
c语言·单片机·嵌入式硬件·51单片机
Sylvia-girl1 小时前
c语言-2-数据类型和变量
c语言·开发语言
闻道且行之1 小时前
C/C++ HTTP 服务:常用方法与实现方式全解析
c语言·c++·http·libhv·curl·mongoose·libcurl
YJlio2 小时前
《Windows 11 从入门到精通》读书笔记 1.4.9:全新的微软应用商店——“库 + 多设备同步”把它从鸡肋变成刚需入口
c语言·网络·python·数码相机·microsoft·ios·iphone
智者知已应修善业2 小时前
【C++非递归剪枝问题凑钱方案数】2024-7-18
c语言·c++·经验分享·笔记·算法·剪枝