看段js代码:

//http://justjavac.com/codepuzzle/2012/09/25/codepuzzle-introduction.html
console.log(0.1 * 10);
//1
console.log(0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1);
//0.9999999999999999
  
console.log(0.2 + 0.4); //0.6000000000000001
 
console.log(010 + '010'); //8010  

整数(8bit)的表示范围是多少?
-2^7 到 2^7 - 1, 也就是 -128 到 +127

abs(x) :=  (x >= 0) ? x : -x

翻译过来就是,x的绝对值定义为:正数和0的绝对值等于它自己,负数的绝对值等于-x。(这里使用的是-x,而没有用0-x,因为在浮点数中,这两者是有区别的。)

深入 -x

学过计算机原理的都知道,负数在计算机中以补码形式存储,计算补码的方式和取反操作类似。

符号位不变,其它位取反,最后加一 绝对值等于自己的数有两个,0 和最小的负数

为什么要+1,因为不是平分的,非负数还有个0

比如 -5

原码:       1000,0101
其它位取反:  1111,1010
加一:       1111,1011

如何取绝对值:

补码:     1111,1011      这是-5在计算机中的表示
各位取反:  0000,0100
加一:     0000,0101      此时结果为+5

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

补码:     1000,0000  //-128
各位取反:  0111,1111
加一:     1000,0000

浮点数

N bit可以表示的信息量是 2^N

问:要把小数装入计算机,总共分几步?你猜对了,3 步。

第一步:转换成二进制 第二步:用二进制科学计算法表示 第三步:表示成 IEEE 754 形式 在上面的第一步和第三步都有可能 丢失精度。

精度是如何丢失的 http://justjavac.com/codepuzzle/2012/11/11/codepuzzle-float-who-stole-your-accuracy.html