关于浮点数
关于浮点数有两个概念较不易理解——数值范围和有效数字。
数值范围:此数据类型可表达的范围。
有效数字:此数据类型有几位可靠的的数字。
(或许还是迷糊,接着往下看吧)
以float为例
1.float可以表达如此大的范围,可是它靠得住得就只有七位数字(不管是否有小数),也就是说可以若是存放0.1234567时最后那个7就不可靠了。抑或是存放12345678时最后那个8就不可靠了。为什么呢?
(看官别急,接着往下看去吧)
我们编译这样几串代码
#include<stdio.h>
int main()
{
printf("%.2f\n",-0.0099);
printf("%.30f\n",-0.0099);
printf("%.2f\n",-0.00099);
printf("%.30f\n",-0.009900000000000000900000000000);
return 0;
}
(运行结果如下)
观察发现。原来,虽然数学中任意两个数之间的数是连续的,数量是连续无穷多个的,但在计算机中却是离散的,是有限多个的。若你想存放的数据刚好在计算机可以表达的两个数之间,那么计算机会取离你那个数最近的那个计算机可准确表达的数来替代它。如此一来,大概能对有效数字与数值范围有个大概的理解了吧。
浮点数在内部的表达
问题
大家先思考对于计算机==12/0==与==12.0/0.0==的结果是相同的吗
相关知识
- 在计算机中,整数之间可以直接做运算,而小数之间却先要经过专门的浮点数硬件来处理。
- 整数在计算机中是通过二进制数直接来存储的,而浮点数则是通过编码的形式存储,要想进行运算,要通过专门的硬件解码然后进行计算,计算完后再编码出结果给你。
解答
于是我们会知道,在我们想要在计算机中计算12/0时,编译器会显示编译错误,而12.0/0.0时却会通过,并最后的结果是inf,表示无穷大
(作者水平有限,若有纰漏,还请读者朋友斧正)