译自:Floating point numbers are a leaky abstraction Posted on 6 April 2009 by John

  “有漏洞的抽象”(leaky abstraction)一词源自Joel Spolsky,他用这个术语表示编程时既能让人免受凌乱的细节所扰,但有时也会把事情弄砸的那些概念。完美的抽象是一个你永远不需要打开的黑盒子。有漏洞的抽象则如同一个偶尔不得不打开一下的黑盒子。

  作为对实数的计算机表示,浮点数就是有漏洞的抽象。通常它们表现得很不错:你甚至可以假装把浮点类型看成数学上的实数。但是当这个有漏洞的抽象“露馅”的时候你却不能这样,虽然这种情况不是很常见。

  我听到过的最多的关于机器数的局限性的解释虽看起来一本正经:“由于只有有限个浮点数,因此它们不能很好地表示实数”但这话基本没什么用!它无法解释为什么在大多数应用中浮点数确实相当好地表示了实数,也没能对这个有漏洞的抽象可能会“露馅”给予任何提示。

  标准浮点数大致有十进制下16位的精度,最大值为10308次方的数量级,即1后面有308个0。(依据IEEE 754标准实现的典型浮点数。)

  十进制16位已经相当不少了。几乎没有任何可测量的量能接近那么大的精度。例如,牛顿万有引力定律中的常数仅仅已知6位有效数字。电子的电荷已知11个有效数字,虽然比牛顿的万有引力常数精度高得多,但仍远低于浮点数。那么何时16位有效数字不够呢?一个产生问题的地方就是减法。其他的基本运算——加法、乘法、除法都非常精确。只要你不上溢或或下溢,这些操作通常会得到直到最后一位都是正确的结果。但减法得到的却可能是从精确到完全不准确之间的任一种结果。如果两个数的n位有效数字相一致,最坏的情况下其减法可能会使n有效数字的精度全部丧失殆尽。这个问题可能出乎预料地在其他计算中间出现。从关于计算标准偏差(calculating standard deviation)的这个帖中既可窥其一斑。在"浮点编程的5个技巧"(Five Tips for Floating Point Programming)帖子的导数计算部分,还有另外一个例子。

  上溢或下溢呢?你什么时候会需要比10308还大的数?通常你是不会需要的。但在诸如概率之类的计算中,除非你足够聪明,否则你始终需要它们。在概率计算中,计算一个天文数字般巨大的数与一个极其极其小的数相乘而得到一个普通大小的乘积是件很稀松平常的事。最终的结果适合计算机(表示)没什么问题,但计算过程中的数可能因为上溢或下溢而不适合计算机的表示。例如大多数计算机中最大的浮点数在170的阶乘与171的阶乘之间。如此巨大的阶乘在许多应用程序中极为平常,常出现在与其他大阶乘的比值当中。参见关于如何计算那些直接计算会导致溢出的阶乘的技巧这篇帖子——"避免上溢、下溢及精度损失"(Avoiding Overflow, Underflow, and Loss of Precision)。

  一般情况下,你能承受对浮点算术细节的那种幸福的无知,但有时你不能。如果想了解更多,David Goldberg的论文“计算机科学家应当知道的浮点算术”(What Every Computer Scientist Should Know About Floating-Point Arithmetic)当推首选。

更新:见后续帖子,浮点数剖析(Anatomy of a floating point number)

相关帖子

怎样计算二项式概率(How to compute binomial probabilities)
NaN, 1.#IND, 1.#INF, 及诸如此类的数(NaN, 1.#IND, 1.#INF, and all that)

转载于:https://blog.51cto.com/minmn/1324048

浮点数:一种有漏洞的抽象【译】相关推荐

  1. xss攻击突破转义_每个人都应该了解的7种xss漏洞

    在阅读有关XSS的材料时,我们通常会看到经典的<script> alert(1)</ script>作为这种漏洞的证明(PoC –概念证明).虽然是正确的,但它并没有超出此范围 ...

  2. TypeScript与Haxe:两种截然不同的JS转译工具横向对比

    转自:TypeScript与Haxe:两种截然不同的JS转译工具横向对比 JavaScript无疑是当今最火爆的编程语言之一,它的崛起要归功于AJAX.Node.js的出现以及时下各种MVC框架的流行 ...

  3. JavaScript 23 种设计模式之 4 抽象工厂模式

    JavaScript 23 种设计模式之 4 抽象工厂模式 概念与特点 结构与实现 应用场景 应用实例 总结 概念与特点 概念: 提供一组相关或相互依赖对象的接口.抽象工厂模式是工厂方法模式的升级版, ...

  4. WEB应用常见15种安全漏洞一览

    摘要: 安全第一! 原文:web 应用常见安全漏洞一览 作者:深予之 (@senntyou) Fundebug遵循创意共享3.0许可证转载,版权归原作者所有. 1. SQL 注入 SQL 注入就是通过 ...

  5. 【译文】抽象漏洞法则

    翻译 :邹永胜 欢迎访问网易云社区,了解更多网易技术产品运营经验. 互联网上有一个很关键的部分,你每天都依赖于它,它处于TCP协议中,它是互联网的基本组成部分之一. TCP协议是可信赖的传输层协议.这 ...

  6. facebook对话链接_并非里程碑! Facebook的100种语言互译模型夸大宣传遭质疑

    [新智元导读]昨天,Facebook宣布其最新的神经机器翻译模型不依赖英语就能实现100种语言的互译,并称之为「里程碑式」进展.今天就有网友发帖质疑,「里程碑」的说法有点夸大宣传,「不依赖英语」也不够 ...

  7. 架构师的第一步:学习两种抽象视角(Abstraction View)

    [ IT史上最完整.最经典的软件框架开发技术宝典 (上百篇经典文章&eBooks) ] ee                                                   ...

  8. 23种设计模式之抽象工厂模式(Abstract Factory Pattern)

    前言:大家好,我是小威,24届毕业生,在一家满意的公司实习.本篇文章将23种设计模式中的抽象工厂模式,此篇文章为一天学习一个设计模式系列文章,后面会分享其他模式知识. 如果文章有什么需要改进的地方还请 ...

  9. 教妹学Java:接口,抽象的另一种表现方式

    接口 "哥,我看你朋友圈说<教妹学 Java>专栏收到了第一笔赞赏呀,虽然只有一块钱,但我也替你感到开心."三妹的脸上洋溢着自信的微笑,仿佛这钱是打给她的一样. &qu ...

最新文章

  1. 【java】java自带的java.util.logging.Logger日志功能
  2. const debug = require(‘debug‘)(‘cnpm‘)
  3. Windows环境 和 Linux环境下搭建Qt开发环境
  4. 埃森哲杯第十六届上海大学程序设计联赛春季赛暨上海高校金马五校赛 F- 1 + 2 = 3? (好难的找规律题)
  5. 使用Eclipse连接SAP Netweaver系统遇到的错误消息和解决办法
  6. html之marquee详解
  7. java oracle 连接字符串函数_通过shell来比较oracle和java中的字符串使用
  8. P2761 软件补丁问题
  9. 红米note3支持html,【小米红米Note3评测】外观变化不小 金色版略显俗套_小米 红米Note3_手机评测-中关村在线...
  10. HTTP协议原理+实践 Web开发工程师必学(笔记)
  11. java 网页通讯_Vue+Java 通过websocket实现服务器与客户端双向通信操作
  12. Flex(flash)检测摄像头的3种状态(是否被占用,没安装摄像头,正常)
  13. 宿命传说2之女神召唤java_宿命传说2-女神的召唤
  14. mysql 大表 驱动_MySql 小表驱动大表
  15. 离职一个月了,也面了很多公司,但都没有offer,软件测试工作怎么就这么难找?
  16. Here we are 团队简介
  17. javascript中的var浅析
  18. 翻译:PropertyWrapper swift 5 aop特性
  19. 慕课PDF下载扩展--再也不用担心慕课不给PDF了
  20. mysql 序列号_mysql 序列号生成器(转)

热门文章

  1. Eclipse利用正则表达式快速去掉注释的方法
  2. Jenkins 插件安装方式全攻略
  3. [Ext JS]8.3 Sencha Studio安装与快速介绍之一
  4. 新增一个主键自增长_使用技巧之——MyBatis如何返回插入主键
  5. matlab设计模拟高通滤波器
  6. matlab中sqp的算法原理_利用fmincon函数中的SQP算法求解非线性规划问题,模型本身.......
  7. kafka集群部署成功后,创建生产者往指定主题里面发送消息时出错
  8. html左侧隐藏菜单栏,如何制作一个炫酷的隐藏侧边栏菜单
  9. log4j1升级log4j2
  10. linux svn删除目录命令,删除目录下的所有.svn版本库目录_CentOS