Bo2SS

Bo2SS

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#

加载中...
此文章数据所有权由区块链加密技术和智能合约保障仅归创作者所有。