看完这篇文章,你肯定理解什么是浮点数了!

浮点数是我们在编程中常用的一个数据类型,不知道大家想过没有,它为什么叫做float呢?

还有,计算机对浮点数的内部表示方法IEEE 874到底是怎么回事?

要彻底理解浮点数,需要从计算机的底层存储开始。

假设有一个32 bit的计算机,需要你来设计一个支持存储“小数”的方案,你会怎么办呢?

定点数

最简单的办法就是把这32位存储分成若干部分, 例如三个部分

(1) 用1位来表达正负位, 0为正, 1为负。

(2) 再划出8位来表示整数部分

(3) 剩下的23位表示小数部分。

就像这样:

640?wx_fmt=png

上图表示的数值就是182.375,由于小数点固定在了第23位和第24位之间,这种方式可以称为“定点数”。

很明显,由于整数部分的长度比较短,所能表示的数据的范围就比较小。 小数部分比较长, 所能表示的精度就比较高。

我们暂时把这种数据类型叫做fixed number A 。

如果想要表达更大范围的数怎么办? 我们还可以定义一个新的数据类型: fixed number B。 让整数部分扩大一些。

640?wx_fmt=png

用23位表示整数,这范围比8位大多了, 但是精度又会受到损失了,可见用这种定点数的表示法,范围和精度是一对儿矛盾。

如果再定义fixed number C, fixed number D, 程序员简直就不知道用哪个了, 并且实现他们之间的计算也很麻烦。

所以定点数并不是完美的解决方案。

浮点数

怎么解决定点数的“僵化”问题呢?

我们都知道科学记数法,例如368.79 用科学计数法表示就是 3.6879 * 10 ^2 。

其中3.6879就是尾数,10 是基数, 2 是指数。

浮点数就是利用指数达到了小数点“浮动”的效果。从而可以灵活地表达更大范围内的数, 比如 :

3.6879 * 10 ^ 2 = 368.79

1.2345 * 10 ^ 3 = 1234.5

7.89 * 10 ^ 2 = 789

小数点的位置是不固定的。

不过对于同一个浮点数,也有很多表达方式, 368.79 可以表达为:

3.6879 * 10 ^ 2

0.36879 * 10 ^ 3

36.879 * 10 ^ 1

由于其多样性, 很多计算机厂商都设计了自己的表示浮点数的规则,以及对浮点数运算的细节。 多样的规则对于程序的可靠性和移植性都是不利的。

1976年, 一家叫Intel的公司要设计一个叫做8087的芯片, 这个芯片在8086处理器(这可是大名鼎鼎的芯片啊,计算机系的同学估计很熟悉吧)上增加了支持浮点数的功能。 他们请加州大学伯克利分校的William Kahan教授作为顾问,帮助设计8087芯片。

Intel 还支持Kahan教授加入IEEE资助的制定工业标准的委员会, 最终这个委员会采纳的标准非常接近于Kahan为Intel设计的标准,这就是大名鼎鼎的 IEEE 754 标准。

(码农翻身注:这段描述来自于《深入理解计算机系统》)

该标准在1985年发布,成为了各个计算机厂商都支持的规范,大大提高了程序的可移植性。

最新的标准是2008年发布的 IEEE 754-2008 。

640?wx_fmt=png

William Kahan教授

IEEE 754

这个标准中有单精度(32位)和双精度(64位), 我们以32位为例来介绍一下,理解了32位,64位就不在话下了。

640?wx_fmt=png

用科学记数法表示,应该是这样的:

(+ or - ) 1.(mantissa) * 2 ^ exponent

注意:小数点前面是有个1的。

我们接下来用一个例子来计算一下, 把5.8 这个10进制小数转换为IEEE 754表示的浮点数。

首先,5.8 = 1.45 * 2 ^ 2,可能有人问,这是怎么算出来的? 很简单:

5.8/2 => 2.9 

2.9/2 => 1.45 

接下来就可以把他表示成IEEE 754的形式:

(1) 可以看出 符号位 s = 0

(2) 指数(exponent) 是2 吗?

No!  指数也有正负之分,我们既要能用8位二进制数字表示正数,又要能表示负数。

所以2的8次方这256个数字要区分开来使用: 从0到127 表示负数, 从128到255表示正数。

127 被称为 Bias  value (偏置值)

所以exponent = 127 + 2 = 129 , 把129用二进制表示就是10000001。

(注:如果原始的指数是 - 2 , 那exponent 就是 127- 2 = 125)

640?wx_fmt=png

(3) 尾数mantissa 是0.45 , 需要转化成二进制,怎么做呢? 也很简单,不断地乘2,取结果的整数部分就行,详细过程如下:


640?wx_fmt=png

可以看出,出现无限循环了,我们取够IEEE 754要求的23位就行了(0.01 1100 1100 1100 1100 1100 1......),可见浮点数是不精确的!

最终,我们把5.8变成了符合IEEE 754 规范的浮点数表示: 

640?wx_fmt=png

很简单的,对吧?

敏锐的同学可能已经看出问题了,这个尾数总是1.mantissa的形式, 那用这种方式怎么才能表示零呢?  

这就留作一个小问题让大家去探索吧, 你会发现非规格化,无穷大,NaN等有趣的东西。


(完)

码农翻身,用故事讲解技术本质, 更多精彩文章,请移步《码农翻身三年文章精华

<think>好的,用户之前问过数据分析的学习路线,现在又问如何学习Python,给出学习步骤。我需要考虑用户可能的背景和需求。用户可能刚开始学习编程,或者想转行数据分析,需要掌握Python作为工具。之前的数据分析路线中已经提到Python的基础,但这次用户希望更详细的学习步骤。 首先,我应该确定用户的需求。他们可能希望从零开始学习Python,然后应用到数据分析或其他领域。需要分步骤,从基础到进阶,涵盖语法、数据结构、项目实战等。还要考虑推荐资源,比如书籍、在线课程、练习平台,帮助用户巩固知识。 接下来,要确保步骤清晰,结构合理。比如分阶段:基础入门、核心语法、项目实战、进阶方向。每个阶段需要具体的内容和资源推荐。还要注意用户可能遇到的难点,比如环境配置、调试错误,给出提示和建议。 同时,结合之前的回答,用户可能对数据分析感兴趣,所以可以在项目实战部分加入数据分析相关的例子,比如爬虫、数据清洗、可视化,或者Web开发、自动化脚本,展示Python的多方面应用。这样既符合用户可能的兴趣,又扩展了Python的应用场景。 另外,需要提醒用户避免常见误区,比如只看不练,或者追求速度忽略基础。强调实践的重要性,多做项目,参与开源,持续学习。最后,给出学习计划模板,帮助用户规划时间,比如3个月速成计划,分阶段目标。 还要检查是否有遗漏的部分,比如开发工具推荐(PyCharm、VSCode)、调试技巧、虚拟环境的使用,这些对新手来说也很重要。资源推荐部分要包括免费和付费选项,适合不同需求的用户。 最后,保持回答结构清晰,使用Markdown格式化,方便阅读。确保语言简洁,步骤明确,用户能按部就班地学习。同时鼓励用户坚持,提供持续学习的建议,比如参与社区、关注新技术。</think>以下是一份系统化的 **Python学习路线**,从**零基础入门到项目实战**,涵盖关键知识点、学习资源及避坑建议,适合编程新手或转行学习者: --- ### **一、基础入门(1-2周)** **目标**:熟悉Python基础语法和开发环境。 1. **开发环境搭建** - 安装Python(推荐**Python 3.10+**版本)。 - 选择编辑器:**VS Code**(轻量级)或 **PyCharm**(功能全面)。 - 学习使用 **Jupyter Notebook**(交互式数据分析)。 2. **基础语法快速掌握** - **变量与数据类型**:整数、浮点数、字符串、布尔值。 - **流程控制**:`if-else`条件判断、`for/while`循环。 - **函数**:定义函数、参数传递、返回值。 - **输入输出**:`print()`、`input()`。 - **代码规范**:缩进规则、PEP8规范。 **学习资源**: - 书籍:《Python编程:从入门到实践》前8章。 - 视频:B站【廖雪峰Python教程】或【莫烦Python】。 --- ### **二、核心语法与数据结构(2-3周)** **目标**:掌握Python核心数据结构和常用库。 1. **数据结构** - **列表(List)**:增删改查、切片、列表推导式。 - **字典(Dict)**:键值对操作、嵌套字典。 - **元组(Tuple)**:不可变特性。 - **集合(Set)**:去重、集合运算。 2. **文件操作** - 读写文本文件(`open()`函数、`with`语句)。 - CSV/JSON文件处理(`csv`模块、`json`模块)。 3. **常用内置库** - `os`:操作系统交互(路径管理、文件遍历)。 - `datetime`:时间日期处理。 - `random`:生成随机数。 **练习建议**: - 用列表推导式生成斐波那契数列。 - 统计一篇英文文章中单词频率(字典应用)。 --- ### **三、面向对象与进阶语法(2-3周)** **目标**:理解Python面向对象编程和高级特性。 1. **面向对象编程(OOP)** - 类与对象:`class`定义、属性、方法。 - 继承与多态:`super()`、方法重写。 - 特殊方法:`__init__`、`__str__`、`__len__`。 2. **进阶语法** - **异常处理**:`try-except-finally`。 - **模块与包**:导入自定义模块、`__init__.py`作用。 - **虚拟环境**:用`venv`或`conda`管理依赖。 3. **第三方库安装** - 使用`pip`安装库(如`pip install requests`)。 - 国内镜像加速(清华源、阿里源)。 **练习项目**: - 实现一个“学生管理系统”(类与对象)。 - 用`requests`库爬取网页内容。 --- ### **四、项目实战(2-3个月)** **目标**:通过项目巩固技能,解决实际问题。 #### **1. 数据分析方向** - **工具库**: - `Pandas`:数据清洗、合并、分组聚合。 - `Matplotlib/Seaborn`:绘制折线图、热力图。 - **项目案例**: - 分析电影数据集(IMDB评分与票房关系)。 - 用Jupyter Notebook输出可视化报告。 #### **2. 自动化脚本方向** - **场景**: - 自动整理文件夹中的文件(按类型分类)。 - 定时爬取天气数据并发送邮件提醒。 - **工具库**:`os`、`shutil`、`schedule`。 #### **3. Web开发方向** - **框架**: - `Flask`:轻量级Web框架(适合API开发)。 - `Django`:全栈框架(自带ORM、Admin后台)。 - **项目案例**: - 搭建个人博客(Django + SQLite)。 - 开发一个TODO任务管理应用。 --- ### **五、避坑指南与学习建议** 1. **避免“只看不写”**: - 每学一个语法,立刻写代码测试(例如:学完列表推导式,尝试将`for`循环改写成推导式)。 2. **善用调试工具**: - 用`print()`输出中间变量。 - 使用VS Code/PyCharm的**断点调试**功能。 3. **优先掌握核心库**: - 初学不必纠结所有第三方库,先精通: - **数据处理**:Pandas、NumPy - **可视化**:Matplotlib - **网络请求**:Requests 4. **参与开源项目**: - 在GitHub上搜索`good first issue`标签的Python项目,提交代码。 --- ### **六、学习资源推荐** | **类型** | **推荐内容** | |----------------|------------------------------------------------------------------------------| | **免费教程** | 菜鸟教程(Python3)、微软Python入门课程(edX)、RealPython(英文) | | **练习平台** | LeetCode(算法)、Codewars(编程挑战)、HackerRank(逻辑训练) | | **书籍** | 《流畅的Python》(进阶必读)、《Effective Python》(最佳实践) | --- ### **七、3个月学习计划模板** | **阶段** | **学习内容** | **目标** | |----------------|-------------------------------------------|---------------------------------------| | **第1个月** | 基础语法、数据结构、文件操作 | 能独立编写100行左右的脚本(如数据清洗) | | **第2个月** | 面向对象、第三方库、项目框架 | 完成1个完整项目(如爬虫/数据分析) | | **第3个月** | 参与开源、学习设计模式/算法 | 能阅读复杂代码,贡献GitHub代码库 | --- ### **关键提醒** - **不要死记语法**:忘记时可以查文档(官方文档 > 百度)。 - **从简单项目开始**:先实现功能再优化代码(例如先写一个能运行的爬虫,再考虑异常处理和性能)。 - **保持兴趣**:用Python解决你生活中的问题(如自动下载音乐、整理照片),比单纯刷题更有动力! 如果需要**某个方向的详细资料**(如数据分析/Web开发),可以告诉我,我会补充具体路径! 🐍
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值