摘录:来自justjavac(迷渡)――代码之谜


第一章:

C中为什么可以i = i + 1?因为=是赋值,注意这只是在大部分语言中这样,比如ST语言就是:=。于是既然=如果不是相等的话,那肯定有表示相等的,比如==或者===。不管是==还是=,「相等」到底是什么意思呢?=或者==或者===,即使以后会出现====,到底和数学的「相等」有多少出入呢?

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


说通俗一点,以前的所有定理、公理都只适用于一个领域,当它进入另一个领域我们就不能把它当作理所当然的,也许它没有问题,比如1+2=3,但也许这只是一个巧合, 上面我就提到了 0.2+0.4 就不等于 0.6。

计算机和现实最大的不同(也是问题的根源)就是,世界是连续的,而计算机是非连续的,是离散的。


第二章:

整数(8bit)的表示范围是多少?”,(也许你已经把教科书的知识背下来了,是 -2^7 到 2^7 - 1,也就是 -128 到 +127。那么这里就有一个很有意思的问题了,0既不是正数也不是负数,把0去掉的话,整数的个数就是奇数了,整数还剩255 个。 奇数个整数不可能平均分成两部分(正数和负数),要么负数多一个,要么正数多一个。事实就是,负数比正数多一个,最小的负数是 -128, 最大的整数是 127。


现在的问题是, -128 的绝对值是多少呢? -(-128)等于多少呢?是溢出呢,还是等于它自己呢?也许计算机课本没有告诉你, 整数是不会出现溢出异常的,整数的溢出被认为是正常的舍弃(其实只要很合理)。整数只有被0除才会异常,而浮点数,即使被0除也不会抛出异常。

绝对值等于自己的数有两个,0 和最小的负数。


在经典数学中,绝对值定义为:“从原点到点A的距离,称为A的绝对值,它是一个非负数”。两个数的大小在数学中如何定义,“距离数轴原点的距离远近”,计算机中大小如何定义的呢?abs(x) := (x >= 0) ? x : -x   翻译过来就是,x的绝对值定义为:正数和0的绝对值等于它自己,负数的绝对值等于-x。(这里使用的是-x,而没有用0-x,因为在浮点数中,这两者是有区别的。)


-x 是如何计算的呢?学过计算机原理的都知道,负数在计算机中以补码形式存储,计算补码的方式和取反操作类似。符号位不变,其它位取反,最后加一。


最小的负数在计算机中表示为 1000,000,下面我们对这个数操作

补码: 1000,0000

各位取反: 0111,1111

加一: 1000,0000

神奇吗,尼玛,居然又回到自己了。















你可能感兴趣的:(数学,false,而且,集合论)