读书人

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

发布时间: 2012-12-20 09:53:21 作者: rapoo

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

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

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

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

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

第一段代码:

     6 楼    utopialxw    2012-09-26              期待后续~    7 楼    jessige_27    2012-09-26              曾经也喜欢研究这些东西的 开始 现在 淡了    8 楼    mzy0316    2012-09-26              引用但是当我们写出 if (3 < a < 5) 时,居然报错了,又是百撕不… 后来被教导了,这么写是错的,应该if (a>3 && a<5)。

这是因为表达式3<a,返回一个布尔值,而一个boolean < 5这样的表达式是不被支持的.
这只是因为默认情况下有些语言没有实现这样的方式
在c++里面,重载运算符.就能实现这样的表达式.当然也没什么意义.

引用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);
二进制浮点数的问题,这不能怪罪于我们以前学过的数学理论知识.
计算机运算都是人设计出来的.也是当时设计出来的遗留问题.可以说这其实与数学理论不违背的.现在有很多种实现小数精确计算的方法了.比如java的大数类 9 楼 lcfred 2012-09-26 很有启发,不过有些观点不是很赞同,比如=只是赋值的一种表现形式,C语系(本人习惯上将C、C++、Java等语法相似的语言统称C语系语言)程序上的x=x+1恰巧和数学方程x=x+1形式一样,而前者有意义,后者无解 10 楼 justjavac 2012-09-27 mzy0316 写道引用但是当我们写出 if (3 < a < 5) 时,居然报错了,又是百撕不… 后来被教导了,这么写是错的,应该if (a>3 && a<5)。

这是因为表达式3<a,返回一个布尔值,而一个boolean < 5这样的表达式是不被支持的.
这只是因为默认情况下有些语言没有实现这样的方式
在c++里面,重载运算符.就能实现这样的表达式.当然也没什么意义.

引用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);
二进制浮点数的问题,这不能怪罪于我们以前学过的数学理论知识.
计算机运算都是人设计出来的.也是当时设计出来的遗留问题.可以说这其实与数学理论不违背的.现在有很多种实现小数精确计算的方法了.比如java的大数类
python 就支持 3 < a < 5 书写形式。
严格的说,计算机浮点数和我们的小数是不同的,他们不属于同一个“群”,或者说他们不属于同一个“域”。
我在随后的『浮点数』篇再详细写。

读书人网 >编程

热点推荐