2 数学运算

课程内容

C语言的数学运算

  • 图片
  • = 赋值

    • 可以与和其他运算符结合使用:+=、<<=、...
  • / 除以

    1. 左右都是整数:整除,下取整
    2. 左右至少有一个浮点数:得到的才是浮点数
  • () 提高运算优先级

  • ⭐位运算,效率高

    • 计算机对于不同的数据类型,都统一按二进制数据存储,即按bit位存储
    • 8bit→1byte
    • int类型是32位bit,对于有符号的最大能表示2^31-1
    • 位运算时,①先展开成二进制位表示,②只有对应的位之间有关系
    • 位运算不支持浮点数?
      • 没有意义。对于64位的浮点数,最高的1位是符号位S,接着的11位是指数E,剩下的52位为有效数字M。
      • 如果按位与,前面12位运算规则是什么呢?即指数位相与结果的意义是什么呢?这就是本质了,两个浮点数相与没有数学意义啊。
    • ^ 异或
      • 特点:是自己的逆运算;支持交换律、结合律
      • 逆运算
        • 前提:符合交换律
          • 减法、除法不符合
          • 减法是加法的逆运算,反之不是
          • 除法是乘法的逆运算,反之不是 [非严格,未考虑乘数为0]
  • << 左移 >> 右移

    • 左移一位,乘以2
    • 右移一位,除以2,下取整,符号不变
      • 左边一直补符号位(最高位为符号位的有符号数)
      • 左边强制补0(无符号数)

C语言的数学函数

头文件:math.h

:abs()函数在stdlib.h里

  • 图片
原型 double pow(double a, double b); 指数函数
- double sqrt(double x); 开平方
- double ceil(double x); 上取整
- 返回的还是double,因为double能够表示超出int的范围的数
- double floor(double x); 下取整
- int abs(int x); 整数绝对值;stdlib.h
- doublefabs(double x); 实数绝对值;f也许在以前代表float
- double log(double x); 以e为底的对数
- double log10(double x); 以10为底
- 换底公式可以求以任何数为底的对数:log(2)8 = log(8) / log(2)
- double acos(double x); 反余弦函数:arccos()
返回值:角度的弧度值
⭐π = acos(-1)
图片

随堂练习

  • 图片
  • double类型的控制字符是“%lf”
  • scanf的控制字符必须与参数的类型对应,否则读不进
    • double x;

    • scanf时一定要用“%lf”对应,不能用“%f”,否则如下:

      • 图片
      • printf没有它严格,控制字符可以不和类型完全一样,应该是有类型转换
      • 代码
        • img
        • 巧妙地是用pow,三分之一次方表示立方根
          • ⭐1/ 3**.0**而不可以是 1 / 3
        • gcc编译时要添加math库,加-lm
  • 图片
  • 注意π可以用acos(-1)得到更精确的表示
  • 代码
    • 图片
    • 先除后乘更安全,不容易溢出

亮点笔记

  • double类型的控制字符是“%lf”
  • π可以用acos(-1)得到更精确的表示

代码演示

练习

  • 图片
  • 用异或做交换思路清奇,但其实并不推荐

    • 只能用于整型,才能异或
    • 速度并不比使用temp快
    • 同一个变量之间swap就会变成0:swap(a, a)

附加知识点

  • 运算符优先级+结合顺序表-百度
    • p--的运算顺序是 ①p指向的地址-1,②再用取该地址的值
      • (*p)--才是①先取p指向地址的变量值,再将变量的值-1
  • 异或规律
    • a ^ a = 0;
    • 0 ^ a = a;
    • 可以在一个数字均出现两次的数组中找有且一个只出现一次的数字
  • xshell运行C语言不报warning
    • g++ *.cpp -Wall
      • 使用该选项,允许发出GCC能够提供的所有有用的警告
      • 也可以用-W{warning}来标记指定的警告。
      • 图片

思考点

  • 用异或运算进行变量交换有什么好处?
    • 节约第三方变量的内存

    • 原理思考

      • 逆运算即可
    • 或者

    • 自身与自身异或为0
      * 任何变量和0异或值不变

    • 按上面的原理思考,其实也可以用+-运算来做?

      • a' = a + b
      • b = a' - b = a
      • a = a' - b = a' - a = b
      • 但是这样做并没有用到位运算的高效性,而且要保证两个数的和不溢出~

Tips