本文引用自作者编写的下述图书; 本文允许以个人学习、教学等目的引用、讲授或转载,但需要注明原作者"海洋饼干叔
叔";本文不允许以纸质及电子出版为目的进行抄摘或改编。
1.《Python编程基础及应用》,陈波,刘慧君,高等教育出版社。免费授课视频 Python编程基础及应用
2.《Python编程基础及应用实验教程》, 陈波,熊心志,张全和,刘慧君,赵恒军,高等教育出版社Python编程基础及应用实验教程
3. 《简明C及C++语言教程》,陈波,待出版书稿。免费授课视频
浮点数就是所谓的小数,一个float类型的对象占据4个字节共32比特。这32个比特以类似于科学计数法的形式来表达一个浮点数,按照IEEE 754标准,其数学表示为:
如图2-6所示,最高的1位(第31位)用做符号位,接着的 8 位(第23-30位)是指数E,剩下的 23 位(第0-22位)为有效数字 M。
相对于float,double类型使用8个字节来存储一个浮点数,它的储值范围以及精度都会高一些。习惯上,我们称float为单精度浮点数,double为双精度浮点数。所有的浮点数类型都是有符号的。
受限于有效数字的位数,浮点数的精度受到限制,会存在微小的误差。为了观察float与double的精度差异及其存储误差,我们创建一个Plain C Application,并修改main.c如下:
//Project - FloatError
#include
int main(){
float f = 0.00001;
printf("The stored value of 0.00001 with float: %.30f\n",f);
double d = 0.00001;
printf("The stored value of 0.00001 with double: %.30f\n",d);
f = f * 99000;
if (f==0.99)
printf("f*99000 == 0.99");
else
printf("f*99000 <> 0.99");
return 0;
}
上述代码的执行结果为:
The stored value of 0.00001 with float: 0.000009999999747378751600000000
The stored value of 0.00001 with double: 0.000010000000000000001000000000
f*99000 <> 0.99
代码第6,第9行的输出结果表明,0.00001存储至浮点数内,均有微弱误差,但double双精度浮点数的误差显然比float要小。
第12 ~ 15行是后面章节要讨论的条件分支语句▲,其语义可以简单理解为“如果… 则… 否则…”。当12行括号内的条件判断成立时,执行第13行,否则,执行第15行。(f0.99)中的号用于判断两端的值是否相等,如果相等,表示逻辑真,否则为逻辑假。从执行结果可以看出,由于存储误差的原因,与预期不符,上述相等判断被认为是假的,第15行代码被执行。
注意 | 一般不要对浮点数进行逻辑相等判断,误差的存在会导致意料之外的结果。很多IDE环境会对上述代码的第12行发出警告:浮点数之间进行==,!= 判断▲是危险的。 |
---|
为了帮助更多的年轻朋友们学好编程,作者在B站上开了两门免费的网课,一门零基础讲Python,一门零基础C和C++一起学,拿走不谢!
如果你觉得纸质书看起来更顺手,目前Python有两本,C和C++在出版过程中。