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 ;

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值