Skip to content

Latest commit

 

History

History
165 lines (118 loc) · 4.34 KB

422-190458-二进制文件流存取浮点数.sy.md

File metadata and controls

165 lines (118 loc) · 4.34 KB
show version enable_checker
step
1.0
true

文件流读写二进制浮点型

回忆

  • 上次在文件流中读写了二进制数字
  • 在多数字的读写实践中,确认
    • 二进制数字更有优势
  • 文件流中可以读写浮点型数字么?🤔

双精度浮点

  • 查看帮助

图片描述

  • 使用"d"模式
    • "d" 双精度

具体编码

  • 对 2.375 编码

图片描述

图片描述

  • 为什么呢?

存储顺序

  • 这涉及到一个东西叫做编码次序

图片描述

  • 主要有两种
    • 一个是 big-endian
    • 另一个是 little-endian
  • 顺序不同
  • 什么意思呢?

顺序模式

  • big-endian 和 little-endian 是两种字节存储机制
address big-endian little-endian
0x0000 0x12 0xcd
0x0001 0x34 0xab
0x0002 0xab 0x34
0x0003 0xcd 0x12
  • 描述在多字节数中各个字节的存储顺序
  • 这个词最早出现在《格利佛游记》
  • 该小说在描述 Gulliver 畅游小人国时碰到了
    • 对水煮蛋
    • 该从大的一端(Big-End)剥开
    • 还是小的一端(Little-End)剥开
    • 争论而引发了一场战争
  • 并形成了两支截然对立的队伍
    • 支持从大的一端剥开的人就称作 Big-Endians
    • 而支持从小的一端剥开的人就称作 Little-Endians

图片描述

各自优势

图片描述

  • 小端模式
    • 强制转换数据不需要调整字节内容
    • 1、2、4 字节整型的存储方式一样
  • 大端模式
    • 符号位的判定固定为第一个字节
    • 容易判断正负

具体架构

  • x86,MOS Technology 6502,Z80,VAX,PDP-11 等处理器为 Little endian
  • Motorola,PowerPC970,System/370,SPARC(除 V9 外)等处理器为 Big endian
  • ARM, PowerPC (除 PowerPC 970 外), DEC Alpha, SPARC V9, MIPS, PA-RISC and IA64 的字节序是可配置的
  • riscv 是小端顺序

图片描述

  • 浮点数编码没有问题
  • 只要我们 pack、unpack 使用同样的模式就可以

写文件

图片描述

  • 写进去 8 个字节

验证

图片描述

  • 确实是 8 个字节
  • 确实是 pack 之后的二进制编码

读取

图片描述

  • 8 字节读出来之后
  • 确实可以原样解回来
  • 下面我们来比较一下
  • 文本和二进制哪个更适合存储浮点

比较

  • 对于 3.375 这个数字
  • 大小
    • 字符串
      • 用 5 个字节
    • 浮点型
      • 用 8 个字节
      • 不过选择单精度浮点型就是 4 个字节
  • 精度
    • 字符串
      • 有效数字越多
      • 字符串越长
      • 所占字节数越多
      • 劣势越明显
    • 浮点型
      • 大小是固定的
      • 所占字节数固定
  • 转化
    • 字符串
      • 需要转化变回到浮点数
    • 二进制
      • 读出来就是浮点数
      • 可以直接计算
  • 这就是二进制浮点型两种编码方式的优缺点

两种编解码方式

  • 浮点型的编解码和整型类似

图片描述

图片描述

  • pack、encode 都是编码
    • 都是把现实世界的数字和文字转化为二进制
  • unpack、decode 都是解码
    • 都是把二进制转化为现实世界的数字和文字

总结

  • 这次在文件流中读写了二进制浮点
  • python 文件流读写浮点数还是很方便的
  • 这就比他的前辈 ABC 语言强了好多
  • 为什么 python 对文件读写这么重视?🤔
  • 下次再说 👋