今天原本还想多学点,结果代码打到一半突然没保存到,导致只能重新打,浪费了很多时间,也就没学什么。
//int main(void)
//{
// float a;
// a = 3.1415926;
// printf("%f can be written %e\nalso can be written %a", a, a, a);
// return 0;
//}
今天学的是浮点数,其中%f,%e,%a分别指的是打印浮点数,打印指数记数法,打印十六进制指数记数法。输入数值是可以就用十进制,在打印的时候再用%e或者%a就可以了,跟%c,%d是一样的。
//浮点数字的范围
//int main(void)
//{
// float num1, num2;
// num1 = 3.14e38;
// num2 = num1 * 10;
// printf("%f\n%f\n", num1, num2);
// return 0;
//}
然后是浮点数的范围,float的范围至少是[1.0e-37,1.0e37],但实际上可以输到1.0e38,但具体到多大就不清楚了,反正是不能到1.0e39的。
//int main(void)
//{
// float a, b;
// a = 0.000001;
// b = a / 2;
// printf("%f\n", a);//0.000001
// printf("%f\n", b);//0.000000
// return 0;
//}
这个是浮点数的下溢,按照这个可以看得出我的编译器应该是到六位有效数字。
//int main(void)
//{
// float a, b, c, d;
// a = 12.3456;//12.345600
// b = a / 10;//1.234560
// c = b / 10;//0.123456
// d = c / 10;//0.012346
// printf("%f\n%f\n%f\n%f\n", a, b, c, d);
// return 0;
//}
//问题一:编译器好像是按小数位数算的而不是有效数字
//问题二:编译器在算到第六位小数的时候下溢好像是会进位的
但是很快问题就出现了,a的打印值上,a明显不止六位有效数字,而又根据后面的可以猜测出我的编译器好像是按照小数位数来看的,而且还存在进位问题。
//int main(void)//先搞清楚问题二
//{
// float a, b, c, d, e, f;
// a = 12.3456f;//12.345600
// b = a / 100;//0.123456
// c = b / 10;//0.012346
// d = c / 10;//0.001235
// e = b / 100;//0.001235
// f = d / 10;//0.000123
// printf("%f\n%f\n%f\n%f\n%f\n%f\n", a, b, c, d, e, f);
// return 0;
//}
//按照上面的结果来说,编译器好像是按照小数位数来计算的
//问题三:计算到第六位是,小数下溢好像是五舍六入
//问题四:在连续除以10和直接除一百的结果上,原本e是不能进位的,因为4后面是5,但现在看来,100应该就是连续除以10
然后我就开始试验我的编译器是不是按照小数位数来看的,通过上面可以看出小数位数只能有六位,而且是五舍六入的进位方式。再从c,d,e不难看出除以100和连续除以10是一样的,原本除以100得到的应该是0.001234,但是还是进了一位,按照原本的猜测5是不会进位的,这说明除以100也是按照10来除的。
//int main(void)
//{
// float a, b, c, d;
// a = 1234.56;//1234.560059
// b = 1234.58;//1234.579956
// c = 123.458;//123.45800
// printf("%f\n", a);
// printf("%f\n", b);
// printf("%f\n", c);
// return 0;
//}
//问题五:在没有满六位小数的浮点数里会自动填充上数字,可是不应该全部上0吗,而a,b填上的是乱码,而且好像有所规律,正常后面补充的会是浮点数未满的小数,可是b上的8却被更改了
就在我继续探究的时候又出现了新的问题,在没有满六位小数的空位上并没有填上0,反而是出现了一堆乱码,而且b中的8甚至还改变了,但是c又是直接填上的0,现在彻底看不懂了。
//int main(void)
//{
// float a, b;
// a = 2.0e20 + 1;
// b = a - 2.0e20;
// printf("end=%f", b);//end=4008175468544.000000
// return 0;
//}
然后是浮点数舍入错误,我的编译器没有足够的位数来计算出结果,一般正常的float只能用指数放大或缩小6或7位的数字,这里就是2.0e20和1相差太大了。
今天码了快四个小时的字,出了一大堆问题,还重新码了一遍,累死了。
标签:10,练习,浮点数,float,n%,第八次,编译器,printf,C语言 From: https://blog.51cto.com/u_16187763/6939747