下面是我这个学期讲授的C/C++课程的内容节选。
废话少说,直接上代码。下面这段代码中,单精度浮点变量f1的值是1.2,f2是其1000000000000000倍(15个0)。然后我们把这两个数值显示到屏幕上。
float f1 = 1.2f;
float f2 = f1 * 1000000000000000;
cout << std::fixed << std::setprecision(15) << f1 << endl;
cout << std::fixed << std::setprecision(0) << f2 << endl
其结果如下:
1.200000047683716
1200000038076416
首先变量f1不是完全等于1.2;其次,f2不是f1的1000000000000000倍。这个例子揭示了一个事实,我们一直认为计算机是无比精确的,事实并非如此;正好相反,在浮点数计算中,计算机从来无法做到精确。要知道,很多算法尤其是人工智能算法,基本上都是采用浮点数进行计算的,原来计算机一直在“糊弄”我们。
现在来解释一下这种现象的原因。
课程全部资料以开源方式实时公布到Github,请各位监督我备课。课程网址:https://github.com/ShiqiYu/CPP
课程视频录制后,我会第一时间放到B站供预览和学习;全部录完后再放到慕课网站学堂在线。B站网址 https://www.bilibili.com/video/BV1Vf4y1P7pq ,或者长按下方二维码访问。前四周的视频已经全部上传。