代码改变世界

随笔分类 -  代码之谜

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

2012-11-16 17:03 by justjavac, 1763 阅读, 收藏, 编辑
摘要: 如果我告诉你,中关村配置最高的电子计算机的计算精度还不如一个便利店卖的手持计算器,你一定会反驳我:「今天写博客之前又忘记吃药了吧」。你可以用最主流的编程语言计算0.2 + 0.4,如果你使用的是 Chrome、FireFox、IE 8+,可以按 F12 键,然后找到 「控制台」,输入上面的表达式0.2 + 0.4,回车。然后再用最简陋的计算器(如果你没有手持计算器没关系,手机、电脑都自带一个计算器,打开“运行”,输入calc,回车) 再计算一下刚才的算式0.2 + 0.4。怎么样?同意我的观点了吧!再简陋的计算器也比超级计算器的精度高,关键不在于它的频率和内存,而在于它是如何设计、如何表示、如 阅读全文

代码之谜(四)- 浮点数(从惊讶到思考)

2012-11-16 11:30 by justjavac, 1024 阅读, 收藏, 编辑
摘要: 在『代码之谜』系列的前几篇文章中,很多次出现了浮点数。 浮点数在很多编程语言中被称为简单数据类型,其实,浮点数比起那些复杂数据类型(比如字符串)来说, 一点都不简单。单单是说明 IEEE浮点数 就可以写一本书了,我将用几篇博文来简单的说说我所理解的浮点数,算是抛砖引玉吧。一次面试记得多年前我招聘 Java 程序员时的一次关于浮点数、二分法、编码的面试, 多年以后,他已经称为了一名很出色的程序员。 每次聚会他都会告诉我,“那次面试彻底改变了我的过去的学习方式, 我以前只是盲目接受知识,根本就没有自己思考过, 那次对话,比我大学四年学到的知识都多”。我看他简历上写到读过《信息论》才谈了很多关于二分 阅读全文

代码之谜(三)- 运算符

2012-11-16 08:22 by justjavac, 1905 阅读, 收藏, 编辑
摘要: 从最简单的运算符加号(+)说起,加号(+)是个二元运算符——也就是说,加号只把两个数联接起来,从来不把第三个或者更多的联接起来。因此,“1加2加3” 在计算机中被表述为:(1 + 2) + 3 // a或者1 + (2 + 3) // b虽然我们通常写做1 + 2 + 3,但是并不意味这它和我们数学中的 1+2+3 是等价的。那么数学中的 1+2+3 到底表示的是 a 呢,还是 b 呢?如果计算机的求值是左结合的,那么此表达式等价于第一种a; 如果是右结合的,那么此表达式等价于第二种b。1 + 2 + 3简单的理解就是 “把1、2、3加在一起”, 确实,在我们接触到的数学里... 阅读全文

代码之谜(二)- 语句与表达式

2012-11-15 14:59 by justjavac, 1223 阅读, 收藏, 编辑
摘要: 虽然文章标题是『语句与表达式』,在这篇文章中,我将陈述一个观点每个表达式都有一个值。 在此之外,也会继续表述这个『代码之谜』系列的主题——数学与计算机之间被经常忽略的矛盾。简单的讲“表达式”(expression)是一个单纯的运算过程,总是有返回值;“语句”(statement)是执行某种操作,没有返回值。使用表达式也是函数式编程语言所提倡的,而传统命令式编程语言都是语句的堆砌。表达式和语句如何区分呢? 最简单最直观的鉴别方法就是,后面有分号的是语句, 这是一个充分条件而不是必要条件。 有分号,就是语句;没有分号,就不一定了,也可能是语句,也可能是表达式。在动态语言——比如javascript 阅读全文

代码之谜(一)- 有限与无限(从整数的绝对值说起)

2012-11-15 11:55 by justjavac, 1770 阅读, 收藏, 编辑
摘要: 一、引子开始本章之前我先提个问题:“如果一个整数的绝对值等于它自己,那么这个数是几?”如果你回答是 0 和 所有正数,那么请你耐心读完这篇文章吧。本章是我『代码之谜』系列的第二篇,前一篇『代码之谜 - 开篇/前言/序』简单介绍了计算机与数学的不同。数学中有许多复杂深刻的矛盾,数学家的工作就是解释或者反驳这些矛盾, 例如有限与无限、连续与离散、存在与构造、逻辑与直观、具体与抽象、概念与计算等等。在本章中,我们把目标缩小,主要讨论内容概念: 有限与无限对象: 8bit整数二、绝对值之谜终于到主题了,也许你很想知道“负数的绝对值可能等于自己吗?”,也就是 “如果x等于-x,那么x有几个解?”按照我一 阅读全文

代码之谜(零)- 其实,你不懂代码

2012-11-08 13:45 by justjavac, 960 阅读, 收藏, 编辑
摘要: 2012年9月28日 13时32分 新增最近看本文评论,争议很多,我先说说这篇文章的前世今生吧。我原文标题是『代码之谜 - 开篇/前言/序』,副标题是『其实,你不懂代码』,本来打算用“其实,代码中的运算符不等价于数学符号”。原文我写于2010年底,当时写在 evernote 中,用了”群“、”域“、”集合“、”关系“的概念解释了计算机中用二进制表示的离散的数和现实中连续的数之间的关系和区别。前几天QQ群里有人问道,遂打算写一个系列,用比较”贫“的语言把他们讲述出来。原文首发在我的博客:http://justjavac.com/codepuzzle/2012/09/25/codepuzzle-i 阅读全文
无觅相关文章插件,快速提升流量