c语言和c++学习中的遇到的一些小坑
1. double a/b;一开始理解为 双精度浮点a 除 双精度浮点b 得到一个双精度浮点数结果。但实际是整型a 除 整型b,得到的结果再强制类型转化为double。
例如 double a = 4/3; 以为:4/3 = 1.33333..... 所以a = 1.33333.....
实际:整型4/ 整型3 = 1, 所以 a = 1.
但 double a = 4.0/3.0, 则a就是浮点数了。
2.visual studio无法使用scanf输入,使用scanf输入会报错,在最顶上加一句 #define _CRT_SECURE_NO_WARNINGS 就可以解决
3. C语言常见数据类型的范围
char -128 ~ +127 (1 Byte) short -32767 ~ + 32768 (2 Bytes) unsigned short 0 ~ 65536 (2 Bytes) int -2147483648 ~ +2147483647 (4 Bytes) unsigned int 0 ~ 4294967295 (4 Bytes) long == int long long -9223372036854775808 ~ +9223372036854775807 (8 Bytes) double 1.7 * 10^308 (8 Bytes)
unsigned int 0~4294967295 long long的最大值: 9223372036854775807 long long的最小值: -9223372036854775808 unsigned long long的最大值:1844674407370955161
__int64的最大值:9223372036854775807 __int64的最小值:-9223372036854775808 unsigned __int64的最大值:18446744073709551615
4. 浮点数在内存中的存储机制和整型数不同,其有舍入误差,在计算机中用近似表示任意某个实数。具体的说,这个实数由一个整数或定点数(即尾数)乘以某个基数(计算机中通常是2)的整数次幂得到,这种表示方法类似于基数为10的科学记数法。所以浮点数在运算过程中通常伴随着因为无法精确表示而进行的近似或舍入。但是这种设计的好处是可以在固定的长度上存储更大范围的数。double和float是浮点数,都会存在精度问题。即double和float的数据都不是精确的数值,而是一个误差极小的近似值,原因是二进制无法精确表示浮点数。
(1)float小数点前后加起来有效数字只有6位。当给定的float有效数在6位以内转换为字符不会丢失精度,当有效位数大于6位就会存在精度丢失
(2)double小数前后加起来的有效数字只有16位,当给定的double有效数在16位以内转换为字符串不会丢失精度,当有效位数大于16位时存在精度丢失
所以,1) 判断两个浮点数相等不能直接用 a == b形式,应该用 a-b> -eps && a-b < eps 形式,eps是很小的数,比如 1e-7 2) 要避免输出 -0.00000 ,避免办法是自己判断要输出的数足够接近于0了,就直接输出 0.00000
如下:
const double esp = 1e-7; //设置一个极小的误差范围 double real, b, a; //设置浮点数 real = -b / (2 * a); //判断浮点数real是否为0,如果为零,则直接赋值0.00000 if (fabs(real)-0 < esp) // 用浮点数real的绝对值减去0,看差值是否小于esp,如果小于就认为是0 { real = 0.00000; }
5. c++输出固定长度浮点数(小数)。
cout << "x2="<< fixed << setprecision(5) << x2 ;