最近看本文评论,争议很多,我先说说这篇文章的前世今生吧。

我原文标题是『代码之谜 - 开篇/前言/序』,副标题是『其实,你不懂代码』,本来打算用“其实,代码中的运算符不等价于数学符号”。原文我写于2010年底,当时写在 evernote 中,用了”群“、”域“、”集合“、”关系“的概念解释了计算机中用二进制表示的离散的数和现实中连续的数之间的关系和区别。

前几天QQ群里有人问道,遂打算写一个系列,用比较「贫」的语言把他们讲述出来。

原文首发在我的博客: http://justjavac.com/codepuzzle/2012/09/25/codepuzzle-introduction.html, 因为我也不能保证我的博客空间总是稳定的,所以,如果博客访问不了,可以到iteye 或 CSDN 查看这篇文章,还可以顺便看看热心网友的评论。


正文分割线


答应了群里的兄弟们要更新博客,结果回家又是洗衣服做饭的,转眼已经10点多了。

趁洗衣机正在转的功夫,打开 Evernote 找到了以前的几段 javascript 代码,本着人性本贱(咳,咳,该死的输入法,更正「人性本荐」)的精神,给大家共享一下,不定期更新,算是我「代码之谜」系列的开篇吧。

我喜欢读一些让人震惊的书,比如『哥德尔、艾舍尔、巴赫书:集异璧之大成』,比如『从一到无穷大』,读完后张大嘴巴,「哇噻,太不可思议了,太令我震惊了」。本系列博客的目的之一就是让每个阅读过的人在思维方式上有所改变,变得更理性,更加会思考,会学习。

本系列说来话长,从10年开始构思,当时写在 evernote 里面,名字叫『理性,像数学家一样思考』,废话少说,言归正传,贴代码吧

第一段代码:

function foo1(a){return a + '01';
}foo1(01);

第二段代码:

function foo2(a){return a + '010';
}foo2(010);

第三段代码: (注: 这不是 javascript 的问题,而且所有语言的问题,归根结底是 IEEE 标准中二进制浮点运算的问题,关于浮点数的详细问题请阅读代码之谜 - 浮点数,「为什么没有链接呢,呵呵,因为我还没有写,正在整理中」。)

console.log(0.2 + 0.4);

第四段代码就相对来说简单多了: 参考我一些发布的这篇为什么 ++[[]][+[]]+[+[]] = 10?。

[4,[3,2]][1][0];     // 3

分割线


2012年9月25日 22时25分 更新

还是忍不住,睡前想唠叨几句。

也许很多人第一次接触编程时,对 i = i + 1 都感到百撕不得骑姐(咳,我就说了嘛,必须得换一个输入法了,更正「百思不得其解」)。

“i加上1怎么可能和i相等呢?”

后来慢慢知道了,不,确切的说,是慢慢地接受了,接受了=是赋值(前提是你学的不是pascal,我的入门语言就是它),因为你可能根本没有思考,只是被动接受

再后来,我们学了 if, 开始写分支代码:

if (a >3) { // do something
}if (a < 5) {// do  something
}

但是当我们写出 if (3 < a < 5) 时,居然报错了,又是百撕不… 后来被教导了,这么写是错的,应该 if (a>3 && a<5)。于是我们又开始接受了,认为这么写是理所当然的,而且以后的代码都是这么写的。

直到有一天,你看了 python 的入门手册,尼玛,居然逆天的出现了 'if 3 < a < 5:',当时绝对又震惊了,“怎么可以这么写?”。难道你忘了,N年前你就是这么写的,而且当时你不也认为3 < a < 5 是理所当然的吗(任何一个高中生都会同意这种写法),为什么你现在又开始觉得 3 < a < 5 是种逆天写法呢,因为你在这几年的编程生涯中,已经被动接受了太多太多的东西,而且使你根本就不曾思考过,这也是我写「代码之谜」系列的初衷。

当你被告知了,在编程中=是赋值的意思(其实他们没有告诉你,只是大部分语言这样,还有很多语言不是这样,比如pascal中:=是赋值,比如basic/VB中=即是赋值也是判断),但是=如果不是相等的话,那肯定有表示相等的,对,就是==,或者===。

不管是==还是=,「相等」到底是什么意思呢?=或者==或者===,即使以后会出现====,到底和数学的「相等」有多少出入呢?

知道我们遇到了传说中的NaN(很多人认为NaN既然表示Not A Number,那么他就是语言定义的一个东东,根本不存在,这是错误的,NaN是在IEEE浮点数规范中明确定义的,包括本系列后面后提到的+0和-0问题),它不等于任何值,而且,它居然不等于它自己。

一个数居然不等于它自己,其实确切的说,是 NaN == NaN 居然返回 false, 甚至 NaN === NaN 也返回 false。是 NaN 的问题,还是==或者===的问题,抑或这根本就是相等这个概念的问题。

在集合论中,相等的三要素,不管是==还是===,都无法满足,所以说,===根本就不是相等(如果你读过数学的「群伦」就更明白了)。

相等(等价)的三要素

  1. 自反省: A等于A
  2. 对称性: 如果A等于B,那么B等于A
  3. 传递性: 如果A等于B,而且B等于C,那么A等于C

当我们看到这几条定理时,我们从来没有怀疑过。脱离了数学,我们进入了编程领域,当我们遇到了NaN,我们知道了,在IEEE的数字表示规范里面,「自反省」是不被满足的,那么传递性和对称性呢? 如果你找到了反例,可以留言。

也许你说,相等/等于/全等/等价这些比较特殊,其它的应该都会满足吧。我只能告诉你(说通俗一点),以前的所有定理、公理都只适用于一个领域,当它进入另一个领域我们就不能把它当作理所当然的,也许它没有问题,比如 1+2=3,但也许这只是一个巧合,上面我就提到了 0.2+0.4 就不等于 0.6。

计算机和现实最大的不同(也是问题的根源)就是,世界是连续的,而计算机是非连续的,是离散的。以前我们学校图书馆有很多「计算机数学」或者「离散数学」之类的书,我现在都不明白,里面写的那些数学,是设计计算机的工程师读呢,还是使用计算机的程序员读呢?里面的内容简直就是大杂烩嘛。什么是离散数学呢?我的理解,不连续的数学都是离散数学。比如量子论里面用到的数学,就是离散数学。

其它算数定律或者定义有不满足的吗?

再举一例,上小学刚学乘法运算的时候老师就告诉我们,3x4就是4个3相加,下面这个例子再次颠覆你的想法。

console.log(0.1 * 10);
console.log(0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1);

写完睡觉,如果大家有什么更好的例子,欢迎补充。

from: http://justjavac.com/codepuzzle/2012/09/25/codepuzzle-introduction.html

代码之谜(零)- 开篇/前言/序相关推荐

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

    2012年9月28日 13时32分 新增 最近看本文评论,争议很多,我先说说这篇文章的前世今生吧. 我原文标题是『代码之谜 - 开篇/前言/序』,副标题是『其实,你不懂代码』,本来打算用"其 ...

  2. 代码之谜(一)- 有限与无限

    一.引子 开始本章之前我先提个问题:"如果一个整数的绝对值等于它自己,那么这个数是几?"如果你回答是 0 和 所有正数,那么请你耐心读完这篇文章吧. 本章是我『代码之谜』系列的第二 ...

  3. JavaScript 编程精解 中文第三版 零、前言

    零.前言 原文:Introduction 译者:飞龙 协议:CC BY-NC-SA 4.0 自豪地采用谷歌翻译 部分参考了<JavaScript 编程精解(第 2 版)> We think ...

  4. [-算法篇-] 开篇前言

    零.前言 [1].从冒泡排序和快速排序引入算法 [2].时间复杂度的引入 [3].空间复杂度的引入 [4].数据结构和算法之间的杂谈 复制代码 关于程序的执行 输入: 原生可用数据 = 数据获取 + ...

  5. js 小数自动补0_JavaScript 时分秒时间代码(自动补零)

    JavaScript 时分秒时间代码(自动补零) function startTime() { var today=new Date() var h=today.getHours() var m=to ...

  6. 【天命奇御】成就进度62/71的通关攻略(1·开篇前言)

    天命奇御于2018.8.9号在wegame上发售 先是一周目记录: 可以说一周目是熟悉最终boss技能后,靠技术过的...... 然后是二周目记录: 开篇前言: 转载于:https://www.cnb ...

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

    在『代码之谜』系列的前几篇文章中,很多次出现了浮点数.浮点数在很多编程语言中被称为简单数据类型,其实,浮点数比起那些复杂数据类型(比如字符串)来说,一点都不简单. 单单是说明 IEEE浮点数 就可以写 ...

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

    虽然文章标题是『语句与表达式』,在这篇文章中,我将陈述一个观点 每个表达式都有一个值.在此之外,也会继续表述这个『代码之谜』系列的主题--数学与计算机之间被经常忽略的矛盾. 简单的讲 "表达 ...

  9. 『重构--改善既有代码的设计』读书笔记----序

    作为C++的程序员,我从大学就开始不间断的看书,看到如今上班,也始终坚持每天多多少少阅读技术文章,书看的很多,但很难有一本书,能让我去反复的翻阅.但唯独『重构--改善既有代码的设计』这本书让我重复看了 ...

最新文章

  1. vuepdf转换html,Vue网页html转换PDF(最低兼容ie10)的思路详解
  2. p2596 书架(Treap)
  3. GARFIELD@02-17-2005
  4. 神州英才战略盈利竞争力总结
  5. Android高级模糊技术RenderScript和FastBlur
  6. 999元/1499元起!Redmi Note 10系列正式首销
  7. ubuntu配置LAMP
  8. vs2005智能提示快捷键,智能完成消失了怎么调出来。
  9. android 飞行模式 配置 wifi可用,飞行模式下使用WiFi教程
  10. Hidden Markov Models Forward算法
  11. springboot配置内存数据库H2
  12. 什么样的视频算搬运的?
  13. winform 两个区域保持固定距离_【麻辣烫】川渝区域零担十强分析:余氏东风、力展、宇鑫、金泓达快运、长吉、西部风、海风快运、绍平、迪丰、健隆......
  14. android中高级面试题,Android高级工程师必看系列
  15. VBA之正则表达式(24)-- 字符串转数组
  16. 【2020 ACM Fellow 华人学者】 陶宇飞 香港中文大学
  17. 软件开发培训机构怎么样?靠谱吗?软件开发培训班哪个好?
  18. DNA存储,拯救人类数据危机的良方?
  19. 怎样设置win10电脑的默认浏览器?技巧经验!win10系统的默认浏览器如何设定?
  20. Java集合篇:Map接口、Map接口的实现类、Collections集合工具类

热门文章

  1. 阿里云发布大数据产品ODPS 6小时处理100PB数据
  2. APM - 使用JavaAgent+Javassit 插桩C3P0
  3. MySQL-主从架构的搭建
  4. JavaScript-JavaScript概述及简单使用
  5. 心中有“树”:数据结构之树详解
  6. 学习笔记(十三)——vim编辑与linux命令
  7. kettle预览点两下才出数_BBG代王 | 7.16直播预览
  8. python判断能否形成等差数列
  9. python知识:函数abs、delattr、hash、memeryview、index
  10. mysql最高权限超级用户是_MySQL中,预设的、拥有最高权限超级用户的用户名为( )...