博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
浮点数的秘密
阅读量:3699 次
发布时间:2019-05-21

本文共 1127 字,大约阅读时间需要 3 分钟。

1 内存中的浮点数

  • 浮点数在内存的存储方式为:符号位、指数、尾数

这里写图片描述

  • float和double类型的数据在计算机内部的表示法是相同的,但由于所占存储空间的不同,其分别能够表示的数值范围和精度不同。

2 浮点数存储示例

  • 浮点数的转换
    1. 将浮点数转换成二进制
    2. 用科学计数法表示二进制浮点数
    3. 计算指数偏移后的值
      注意:计算指数时需要加上偏移量,而偏移量的值与类型有关。
      示例:对于指数6,偏移后的值如下:
      float:127+6->133
      double:1023+6 -> 1029

实数8.25在内存中的float表示

  • 8.25的二进制表示:1000.01 -> 1.00001*(2^3)
    • 符号位:0
    • 指数:127+3->130->10000010
    • 小数:00001
  • 内存中8.25的float表示
    • 0 10000010 00001000000000000000000 -> 0x41040000

编程实验:10进制浮点数的内存表示

#include 
int main(){ float f = 8.25; unsigned int* p = (unsigned int*)&f; printf("0x%08X\n", *p); return 0;}输出结果:0x41040000

3 浮点数类型的秘密

  • int类型的范围:[-2^31, (2^31)-1]
  • float类型的范围:[-3.4*10^38, 3.4*10^38]

    思考:int和float都占4个字节的内存,为什么float却比int的范围大得多呢?

  • float能表示的具体数字的个数与int相同

  • float可表示的数字之间是不连续的,存在间隙
  • float只是一种近似的表示法,不能作为精确数使用
  • 由于内存表示法相对复杂,float的运算速度比int慢很多
  • 注意:double与float具有相同的内存表示法,因此double也是不精确的。由于double占用的内存较多,所能表示的精度比float高

实例分析:float类型的不精确表示

#include 
int main(){ float f = 3.1415f; float fl = 123456789; printf("%0.10f\n", f); printf("%0.10f\n", fl); return 0;}输出结果:3.1414999962123456792.0000000000

4 小结

  • 浮点类型与整数类型的内存表示法不同
  • 浮点类型的内存表示更复杂
  • 浮点类型可表示的范围更大
  • 浮点类型是一种不精确的类型
  • 浮点类型的运算速度比较慢
你可能感兴趣的文章
Java如何实现二维码?【附源码】
查看>>
JVM遇到OOM如何排错,如何使用工具分析问题所在,这篇文章告诉你!
查看>>
JeecgBoot部署到服务器后加载速度较慢解决方案
查看>>
Java 中一个元素在集合中如何忽略自己循环比对是否存在相同元素
查看>>
JAVA如何计算字符串公式
查看>>
Java 实现 crc modbus 16 位校验算法
查看>>
Java工作中常用方法总结
查看>>
vue 项目修改 title 旁边的 icon 图片
查看>>
Jeecg-Boot前端图片更改(网站 title 图标修改)
查看>>
win10 安装 mysql5.7
查看>>
前端通过 v-html 或 js 都可以替换富文本中的标签
查看>>
vue 项目中使用原生 input type=“file“上传图片,限制上传大小,限制上传类型
查看>>
自定义注解通过反射实现Excel的导出功能(提供项目源码)
查看>>
SpringBoot + Ant Design Vue 实现 excel 导入功能
查看>>
vscode终端无法执行命令行
查看>>
史上功能最全的Java权限认证框架
查看>>
使用EasyPoi完成复杂一对多excel表格导出功能
查看>>
mybatis 中使用 CASE WHEN 关键字报错问题解决方案
查看>>
VsCode 常用插件
查看>>
CTF夺旗赛总结
查看>>