C语言菜鸟基础教程之单精度浮点数与双精度浮点数

上节课 简单介绍了浮点数。计算机程序中的浮点数分为单精度浮点数和双精度浮点数。

单精度和双精度精确的范围不一样。

计算机里的最基本的存储单位用位(bit)来表示。bit只能用来存储0或1。
稍大一点的单位是字节(Byte,简写为B)。
再大一级的是千字节(kilo Bytes),用k来表示。
再大一级的单位是兆字节(Mega Bytes),用M来表示。一张照片的大小通常为1~3M。
再大一级的单位为G。一部高清电影的大小通常为1~2G。
再大一级的单位为T。

换算关系为:

1B = 8bit
1k = 1024B = 2^10 B
1M = 1024k = 2^20 B
1G = 1024M = 2^30 B
1T = 1024G = 2^40 B

单精度(float)在计算机中存储占用4字节,32位,有效位数为7位(6位小数+小数点)。
双精度(double)在计算机中存储占用8字节,64位,有效位数为16位(15位小数+小数点)。
不管是float还是double,在计算机中的存储都遵循IEEE规范,使用二进制科学计数法,都包含三个部分:符号位、指数位和尾数部分。其中float的符号位、指数位(即整数部分)、尾数部分分别为1, 8, 23。双精度则分别为1, 11, 52。

float

double

精度主要取决于尾数部分的位数,float为23位,最小为2的-23次方,约等于1.19乘以10的-7次方,所以float小数部分只能精确到后面6位,加上小数点算做一位,即有效数字为7位。
类似,double 尾数部分52位,最小为2的-52次方,约为2.22乘以10的-16次方,所以精确到小数点后15位,有效位数为16位。

程序验证:

#include <stdio.h>

int main()
{

  float a = 1.123456789;
  printf("a = %20.9f\n", a);

  double b = 2.123456789;
  printf("b = %20.9f\n", b);

  return 0;
}

注意:这里%20.9f表示浮点数总共有20位,其中小数占9位。不足20位的部分,左侧用空格来填充。

运行结果:

a =     1.123456836
b =     2.123456789

从运行结果可以看出,单精度浮点数小数部分只有前6位是准确的,后三位是不准确的。双精度小数部分9位都是准确的。

(0)

相关推荐

  • 基于C++浮点数(float、double)类型数据比较与转换的详解

    浮点数在内存中的存储机制和整型数不同,其有舍入误差,在计算机中用近似表示任意某个实数.具体的说,这个实数由一个整数或定点数(即尾数)乘以某个基数(计算机中通常是2)的整数次幂得到,这种表示方法类似于基数为10的科学记数法.所以浮点数在运算过程中通常伴随着因为无法精确表示而进行的近似或舍入.但是这种设计的好处是可以在固定的长度上存储更大范围的数.1.将字符串转换为float.double过程存在精度损失,只是float.double各自损失的精度不相同而已std::string str="8.2&

  • 解析C++ 浮点数的格式化输出

    C++格式化输出浮点数 复制代码 代码如下: #include <iostream>using std::cout;using std::endl;using std::fixed;using std::scientific;int main(){   double x = 0.001234567;   double y = 1.946e9;   cout << "Displayed in default format:" << endl <&

  • 解析C++ 浮点数的格式化显示

    代码如下所示: 复制代码 代码如下: #include <stdlib.h>      #include <string>      #include <windows.h>      #include <stdio.h>      #include <iostream>      #include <limits>      #include <sstream>      using namespace std; str

  • 深入C/C++浮点数在内存中的存储方式详解

    任何数据在内存中都是以二进制的形式存储的,例如一个short型数据1156,其二进制表示形式为00000100 10000100.则在Intel CPU架构的系统中,存放方式为  10000100(低地址单元) 00000100(高地址单元),因为Intel CPU的架构是小端模式.但是对于浮点数在内存是如何存储的?目前所有的C/C++编译器都是采用IEEE所制定的标准浮点格式,即二进制科学表示法.在二进制科学表示法中,S=M*2^N 主要由三部分构成:符号位+阶码(N)+尾数(M).对于flo

  • 深入C++浮点数无效值定义与判定的解决办法

    在实际计算中可能会出现浮点型的无效数据,格式化输出到文件中内容为1.79769e+308,输出到界面就是很大一串数据.这两种方式无论哪种在阅读和查找时就不是很方便.无效值定义如下:#define InvalidDouble *(double*)("\xff\xff\xff\xff\xff\xff\xef\x7f")double  price;.........(计算步骤省掉)price=GetPrice(); //获取数据 通过下面方式对浮点型的数据进行判定(price==Invali

  • 解析C++浮点数无效值的定义与无效值判定的小结

    在实际计算中可能会出现浮点型的无效数据,格式化输出到文件中内容为1.79769e+308,输出到界面就是很大一串数据.这两种方式无论哪种在阅读和查找时就不是很方便.在开发中遇见浮点型数据无效值得判定. 无效值定义如下:#define InvalidDouble *(double*)("\xff\xff\xff\xff\xff\xff\xef\x7f")double  price;.........(计算步骤省掉)price=GetPrice(); //获取数据 通过下面方式对浮点型的无

  • C语言菜鸟基础教程之单精度浮点数与双精度浮点数

    上节课 简单介绍了浮点数.计算机程序中的浮点数分为单精度浮点数和双精度浮点数. 单精度和双精度精确的范围不一样. 计算机里的最基本的存储单位用位(bit)来表示.bit只能用来存储0或1. 稍大一点的单位是字节(Byte,简写为B). 再大一级的是千字节(kilo Bytes),用k来表示. 再大一级的单位是兆字节(Mega Bytes),用M来表示.一张照片的大小通常为1~3M. 再大一级的单位为G.一部高清电影的大小通常为1~2G. 再大一级的单位为T. 换算关系为: 1B = 8bit 1

  • C语言菜鸟基础教程之数据类型

    C语言的数据类型有整型.浮点型(就是小数).字符.字符串.数组.结构体等.刚开始学的时候,不要一下子学太多.先学最基本的整型.浮点型和字符. 对于学习程序来说,最重要的是动手操作. 先编写程序: #include <stdio.h> int main() { int a = 1; printf("a = %d\n", a); float b = 2.2; printf("b = %f\n", b); char c = 'A'; printf("

  • C语言菜鸟基础教程之判断

    (一) 先动手编写一个程序: #include <stdio.h> int main() { if(1) { printf("The condition is true!\n"); } return 0; } 运行结果: The condition is true! 再把1依次改为,2,5,100,-10,发现运行结果完全一样. 再改成if(0),此时发现没有运行结果,说明printf()语句没被执行. C语言把判断语句中的任何非0或非空的值当作真.所以if(1), if(

  • C语言菜鸟基础教程之常量和变量

    先动手编写程序: #include <stdio.h> int main() { int a = 1; printf("a = %d\n", a); a = 2; printf("a = %d\n", a); return 0; } 运行结果: a = 1 a = 2 程序分析: int a = 1; 定义了一个整型变量a,把1赋值给a.注意,C语言中的等号表示赋值,作用是把一个常量赋值给一个变量,这样变量就获得了一个临时的固定值. 为什么说是临时的呢?

  • C语言菜鸟基础教程之条件判断

    (一)if...else 先动手编写一个程序 #include <stdio.h> int main() { int x = -1; if(x > 0) { printf("x is a positive number!\n"); } else { printf("x is not a positive number!\n"); } return 0; } 运行结果: x is not a positive number! 程序分析: 定义一个整数

  • C语言菜鸟基础教程之自定义函数

    先动手编写程序: #include <stdio.h> int add(int x, int y) { int z = x + y; return z; } int main() { int a = 1; int b = 2; int c = add(a, b); printf("c = %d\n", c); return 0; } 运行结果: c = 3 程序分析: (1) 函数定义的形式为: 类型 函数名称(类型 形式参数,--) { 函数体 } (2) 对应于咱们的程

  • C语言菜鸟基础教程之加法

    先动手编写程序: #include <stdio.h> int main() { int a = 1; int b = 2; int c = a + b; printf("sum is %d\n", c); return 0; } 运行结果: sum is 3 程序分析: 先定义一个整型变量a,把1赋值给a. 再定义一个整型变量b,把2赋值给b. 最后定义一个整型变量c,它的值不是靠赋值得到的,而是把a和b相加之后的值赋值给它,即c的值为3.

  • C语言函数基础教程分类自定义参数及调用示例详解

    目录 1.  函数是什么? 2.  C语言中函数的分类 2.1 库函数 2.1.1 为什么要有库函数 2.1.2 什么是库函数 2.1.3 主函数只能是main()吗 2.1.4常见的库函数 2.2 自定义函数 2.2.1自定义函数是什么 2.2.2为什么要有自定义函数 2.2.3函数的组成 2.2.4 举例展示 3. 函数的参数 3.1 实际参数(实参) 3.2  形式参数(形参) 4. 函数的调用 4.1 传值调用 4.2  传址调用 4.3 练习 4.3.1. 写一个函数判断一年是不是闰年

  • WAP建站WML语言语法基础教程第1/6页

    完成WAP服务器的建立和WAP浏览器的安装之后,我们接下来就可以使用WML语言来编写WAP网页或应用,并通过WAP服务器及浏览器进行调试.从本章开始我们将系统地学习WML语言,本章主要讲解WML语言的基础知识,下一章全面讲解WML的语法.标签和规则. 2.1 WML的简单例子及编辑.测试方法 无限标记语言WML(Wireless Markup Language)是一种基于扩展标记语言XML(Extension Markup Language)的语言,是XML的子集.它可以显示各种文字.图像等数据

  • C语言菜鸟基础教程之a++与++a

    (一)a++ 在C语言或其它语言中,++符号表示"自加",就是变量在原来的基础上加1. 例1: a = 0; a++; 则此时a的值为1. 同样的道理,--表示"自减". 例2: a = 100; a--; 则此时a的值为99. 注意,程序语言里没有"自乘"和"自除"的概念. 验证程序: #include <stdio.h> int main() { int a = 0; // 给a赋值 a++; printf(&

随机推荐