前言:
现在姐妹们对“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个数字最小的数算法