代码之谜(五)- 浮点数(谁偷了你的精度?)

本文探讨了计算机中浮点数表示的精度问题,指出超过99.999%的数在计算机中无法表示,且即使是简陋的计算器也能提供更高的精度。文章通过10的38次方与10的10次方的对比,揭示了浮点数表示的局限性。重点分析了二进制转换中如何导致精度丢失,以及有限小数和无限循环小数在二进制下的表示。作者强调,即使是有限小数如0.1也无法精确表示,并以0.2 + 0.4不等于0.6为例,展示了浮点数运算中的精度损失问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

****光棍节加长版****

如果我告诉你,中关村配置最高的电子计算机的计算精度还不如一个便利店卖的手持计算器,你一定会反驳我:「今天写博客之前又忘记吃药了吧」。

你可以用最主流的编程语言计算 0.2 + 0.4,如果你使用的是 Chrome、FireFox、IE 8+,可以按 F12 键,然后找到 「控制台」,输入上面的 表达式 0.2 + 0.4,回车。

然后再用最简陋的计算器(如果你没有手持计算器没关系,手机、电脑都自带一个计算器,打开“运行”,输入calc,回车) 再计算一下刚才的 算式 0.2 + 0.4。

怎么样?同意我的观点了吧! 再简陋的计算器也比超级计算器的精度高,关键不在于它的频率和内存,而在于它是如何设计、如何表示、如何计算的

不能表示 VS 不能精确表示

在上一章『浮点数(从惊讶到思考)』中我们讲到用浮点数表示  时出现的问题——很多数都 不能表示。(注意 浮点数表示的是数,而不仅仅是小数。)

如果你数学比较好,或者你确信你身体健康,没有心脏病、高血压,没有受过重大精神创伤,那我告诉你, 在浮点数的表示范围内,有多于 99.999…% 的数在计算机中是 不能表示 的。 真的是太令人吃惊,也太令人遗憾了。 真相总是很残忍。

请注意我使用的措辞,区别开 不能表示 和 不能精确表示

下面我从数量级分析一下,32bit 浮点数的表示范围是 10 的 38 次方,而表示个数呢,是 10 的 10 次方。 能够被表示的数只有 1/100000000…. (大概有30个零),这个数多大呢?还记得那个国际象棋和麦子的故事吗?

为了让你了解 指数的威力,我再举个例子:

有一张很大很大的纸,对折 38 次,会有多高呢? 一米?一百米?比珠峰还高?再次考验你心脏承受能力的时刻到了:它不仅仅比珠峰高,其实它已经快到达月球了。

回到原来的话题,还有更残忍的真相。 在剩下的可以表示的不到 0.000…1% 的数中,又有多少不能精确表示呢?这就是我写这篇博客的目的。

上一章中我还给出了一种用定点数精确表示小数的方法。 事实上,手持计算器、java 中的 BigDecimal、C# 中的货币类型、MySQL 中的 NUMERIC 类型就是这么干的。 你还记得在数据库中添加字段时的 SQL 语句是如何写的吗?现在明白为什么我说 再简陋的计算器也比超级计算器的精度高 了吧。

这篇博客我将为大家讲解为什么很多数 不能精确表示,本篇可能比较烧脑子,我会尽量用最通俗的语言,最贴近现实的例子来讲解,不在乎篇幅有多长,关键是

在IT领域中,“独孤九剑”不仅是一个武侠概念,还被广泛应用于技术开发、算法设计以及一些具体的应用场景。以下是与“独孤九剑”相关的几个方面及其可能的技术实现或应用: --- ### 1. 游戏中的独孤九剑 《我功夫特牛》是一款以武侠为主题的游戏,在游戏中可以通过特定的方式合成独孤九剑这一顶级武功。 - 合成条件通常包括收集足够的材料或者完成某些任务。 - 这种机制可以被视为一种资源管理与逻辑判断的编程实践。 ```python # 示例:一个简单的Python脚本模拟独孤九剑合成过程 class Sword: def __init__(self, name): self.name = name def synthesize_swords(sword_list): if len(sword_list) == 9 and all(isinstance(x, Sword) for x in sword_list): return "独孤九剑" else: return "未满足合成条件" sword_parts = [Sword(f"Part_{i}") for i in range(1, 10)] result = synthesize_swords(sword_parts) print(result) # 输出:独孤九剑 ``` --- ### 2. 数据科学领域的独孤九剑 在机器学习和深度学习的研究中,有人提出过类似“独孤九剑”的思想——即通过不断优化模型来达到极致性能的方法论。例如: - **LBA (Learning by Asking)** 是一种基于提问的学习框架,类似于独孤九剑中的“无招胜有招”,强调灵活应对不同问题的能力。 - 具体实现涉及强化学习、自然语言处理等技术。 $$ \text{Loss} = \sum (\hat{y}_i - y_i)^2 + \lambda R(\theta) $$ 其中 $\hat{y}$ 表示预测值,$y$ 表示真实值,$\lambda R(\theta)$ 是正则化项。 --- ### 3. 用户体验设计中的独孤九剑 互联网产品设计中有著名的“独孤九剑”理论,主要指代用户思维的核心原则。这些原则可以帮助开发者更好地理解用户需求并提供卓越的服务。例如: - 超越用户期望的设计; - 关注细节,确保流畅的操作流程; - 提供个性化推荐功能。 这种理念可以在前端开发中体现为交互设计的最佳实践。 ```html <!-- 示例HTML代码片段 --> <div class="user-interface"> <button onclick="enhanceExperience()">提升用户体验</button> </div> <script> function enhanceExperience() { alert("已加载最新版本的功能!"); } </script> ``` --- ### 4. 安全防护中的独孤九剑 在网络信息安全领域,“独孤九剑”也可以比喻为一套全面的安全策略集合。比如: - 实现多层次的数据加密; - 开发高效的入侵检测系统; - 利用区块链技术保护隐私信息。 这方面的实际案例可见于各类安全竞赛题目解析文档中提到的相关技巧。 ---
评论 44
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值