一些易错的地方

NO.1 移位运算

long long x= 1<<62; (错)

正解:long long x=(long long )1<<62;    值为:4611686018427387904  大于1e18,大概是1e18的4倍。

即是:二进制下1后面62个0,共63位。

NO.2 math.h

sqrt()

double sqrt(double x);
float sqrtf(float x);
long double sqrtl(long double x);

  float:2^23 = 8388608,一共七位,这意味着最多能有7位有效数字,但绝对能保证的为6位,也即float的精度为6~7位有效数字;
  double:2^52 = 4503599627370496,一共16位,同理,double的精度为15~16位。能绝对保证15位;数值范围:-1.7*10^-308~1.7*10^308

long double:精度为18~19位,能绝对保证18位。;数值范围:-1.2*10^-4932~1.2*10^4932

超出范围一定要自己写二分!!!

pow()

double pow(double x, double y);
float powf(float x, float y);
long double powl(long double x, long double y);

没有int型的一定要考虑误差,千万不能 int i=pow(10,5);这种写法,答案可能是99999.

不能把浮点型赋值给整形。因为浮点型是一个近似表示。

NO.3  #define swap(a,b) (a^=b^=a^=b)

要注意判断a=a的情况,也就是swap(a,a),比如swap(a[i],a[j])  i==j的情况

原文地址:https://www.cnblogs.com/sun-yinkai/p/8169129.html