龙空技术网

C语言027 float彻底研究(五) 1.0~1.9区间浮点数分析

编程牛6558 137

前言:

现在姐妹们对“c求4个数字最小的数算法”大约比较注意,姐妹们都想要知道一些“c求4个数字最小的数算法”的相关知识。那么小编在网上搜集了一些有关“c求4个数字最小的数算法””的相关知识,希望小伙伴们能喜欢,你们快快来学习一下吧!

1.0~1.999999...空间

精度为1.19209e-7,而精度就是指将一个浮点数改变的最小值。

1.0是可以精确表示的,表示为:1.000 0000,按照间隔理论,下一个蓝点是:1.000 000 119209...,如下图所示:

可以认为这是粒度最小的地方,再下一个蓝点,就是再加上1.19209e-7,后续以此类推。得到表如下:

无论是1.000 000 2xxxx或是1.000 000 9xxxx等样式,超出小数点第七位之后无论有多少位,得到的结果都是表右的这10个数之一。

再加一次,进位

把1.000 0009的实际表示值再加一次精度,大约得到1.000 001072...,我们心里预测到1.000 0010的表示大概会是这个数,然而结果还是1.000 0009的实际表示值

printf("%.16f\n",1.0000010f);//打印结果:1.0000009536..//说明没有进到下个值printf("%.16f\n",1.0000011f);//打印结果:1.00000107288...//说明浮点值移到该处...

不管猜的对不对,但至少达到一种阶段:我们可以预测一个浮点数大概是多少

由于精度不变,而数差值变大了,说明移动次数变多了(如果不理解,请快速参考前面的文章);

我们看到当前的数是,1.00000107288,而精度是1.19209e-7,如果想把位数往左再抬升一位,需要加很多次。

做个通俗的比喻,原来只需要+10次精度就将数抬升一位,现在想把1.000001.. → 1.00001.. 需要加100+次才能到,按照这个趋势,将1.00001 → 1.0001,需要加1000+次的精度;将1.0001 → 1. 001,需要加10000+次的精度;将1.001 → 1.01需要加100000+次的精度.....

一旦原理理解,世界从此一片光明!

浮点数再也不像摇骰子那样不可预测,从推导过程中可以看出,是一个“愚公移山”的过程:在某个区间内,精度是固定的,我们就不停的加这个精度,将“时钟”的指针向前拨动

1.0~1.9的区间是这样,其它区间类比也是如此。

实验用到的代码

一、生成宏字符串,打印到文件

/****	作用:生成打印字符串*	日期:2022/12/19 2:56*	作者:tianya*****/int main(int argc, char* argv[]){	FILE *fp=fopen("e:/7进6浮点数.txt","w");	if(fp==NULL){		printf("打开文件失败!\n");		return -1;	}	for(int i=10;i<=99;i++){		fprintf(fp,"	print_float(1.00000,%d);\n",i);	}	fclose(fp);	return 0;}

二、测试代码

准备工作:将上面代码生成的内容整个复制到下面代码中

//#define print_float(n,x) fprintf(fp,"	%.16f\n",n##x##f)#define print_float(n,x) printf("%d=>%.16f\n",x,n##x##f)int main(int argc, char* argv[]){	print_float(1.000000,98);	print_float(1.000000,99);	printf("-----------------\n");	//下面是前面代码生成的内容	print_float(1.00000,10);	print_float(1.00000,11);	print_float(1.00000,12);	print_float(1.00000,13);	print_float(1.00000,14);	print_float(1.00000,15);	//..限于篇幅,省略..	return 0;}
结语

这篇分析了1.0~1.9区间的浮点数分布和具体推导

标签: #c求4个数字最小的数算法