天天看点

[C] 2. 数学运算1. C语言的数学运算2. C语言的数学函数库3 随堂练习

1. C语言的数学运算

1.1 运算符

[C] 2. 数学运算1. C语言的数学运算2. C语言的数学函数库3 随堂练习
  1. / 除 (C语言隐式类型转换规则)

    左右都是整数:整除,下取整 3 / 2 = 1

    左右至少有一个浮点数:结果是浮点数 3 / 2.0 = 1.5

  2. ⭐位运算,效率高

    不同数据类型的底层都是二进制存储,即按bit位存储

int类型是32位bit,对于有符号的最大能表示2^31-1

位运算时,①先展开成二进制位表示,②只有对应的位之间有关系

位运算不支持浮点数?

没有意义。对于64位的浮点数,最高的1位是符号位S,接着的11位是指数E,剩下的52位为有效数字M。

如果按位与,前面12位运算规则是什么呢?即指数位相与结果的意义是什么呢?这就是本质了,两个浮点数相与没有数学意义啊。

位运算的核心:将当前的数据以2进制位的形式进行看待所作的运算

符号位为0正数,符号位为1负数

  1. << 左移 >> 右移

    左移一位,乘2

    右移一位,除2,下取整、符号不变

    左边一直补符号位(最高位为符号位的有符号数)

    左边强制补0(无符号数)

2. C语言的数学函数库

[C] 2. 数学运算1. C语言的数学运算2. C语言的数学函数库3 随堂练习
  • pow函数(power)
    [C] 2. 数学运算1. C语言的数学运算2. C语言的数学函数库3 随堂练习
  • sqrt函数(square root)
    [C] 2. 数学运算1. C语言的数学运算2. C语言的数学函数库3 随堂练习
  • ceil函数(天花板函数)
    [C] 2. 数学运算1. C语言的数学运算2. C语言的数学函数库3 随堂练习
  • floor函数(地板函数)
    [C] 2. 数学运算1. C语言的数学运算2. C语言的数学函数库3 随堂练习
  • abs函数 【特殊】
    [C] 2. 数学运算1. C语言的数学运算2. C语言的数学函数库3 随堂练习
  • fabs函数(float abs)
    [C] 2. 数学运算1. C语言的数学运算2. C语言的数学函数库3 随堂练习
  • log函数
    [C] 2. 数学运算1. C语言的数学运算2. C语言的数学函数库3 随堂练习
  • log10函数
    [C] 2. 数学运算1. C语言的数学运算2. C语言的数学函数库3 随堂练习
    【换底公式】 log28 = log108 / log102,可以求以任何数为底数的对数值
  • acos函数(反余弦函数)
    [C] 2. 数学运算1. C语言的数学运算2. C语言的数学函数库3 随堂练习
  1. 原型在C语言编译器中可以通过编译,了解库函数最好的方式就是看原型
  2. abs函数头文件math.h、参数和返回值为int,与其他函数不同
  3. acos函数参数是弧度值

    acos(90o) — ×,acos(Π/2) — √

    求Π:cos(Π) = -1,所以acos(-1) = Π

  4. C语言有29个函数库

3 随堂练习

3.1 求x立方根

[C] 2. 数学运算1. C语言的数学运算2. C语言的数学函数库3 随堂练习
#include <stdio.h>
#include <math.h>

int main() {
    double x;
    scanf("%lf", &x); //double格式占位符%lf
    //pow(x, 1 / 3)错误,因为 1/3==0
    printf("%lf\n", pow(x, 1.0 / 3)); // 1.0/3.0 或 1/3.0
    return 0;
}
           

3.2 角度值转化弧度值

[C] 2. 数学运算1. C语言的数学运算2. C语言的数学函数库3 随堂练习
#include <stdio.h>
#include <math.h>
#define PI acos(-1)

int main() {
    double x;
    scanf("%lf", &x);
    printf("%lf\n", x * PI / 180);
    return 0;
}
           

3.2 运算符优先级

#include <stdio.h>

int main() {
    int a = 7, b = 3, c;
    a += 7; // a = a + 7;
    int *p = &a;
    //*p--; 等价于 *(p--)
    //取值运算符*、后置自增运算符-- 优先级相同,结合顺序从右向左  
    (*p)--; // a--
    printf("a = %d, b = %d\n", a, b);
    return 0;
}
           
  1. 运算符优先级

    优先级高先运算,优先级相同按结合顺序依次进行运算

    () 提升优先级

  2. ^ 异或

    是自己的逆运算;支持交换律、结合律

  3. 逆运算

    前提:符合交换律

    减法、除法不符合

    减法是加法的逆运算,反之不是

    除法是乘法的逆运算,反之不是 [非严格,未考虑乘数为0]

⭐2个数异或 有2种性质

  1. 找出两个数有差异的位,a ^ b 得到的结果中,1表示在该位两数存在差别,0表示无差别
  2. 将一个数按照另一个数的对应位的取值改变取值,如a ^ b (10001010 ^ 00110011),可以看成a按照b的要求改变对应位的取值(1为改变,0为不改变)故得到10111001。要清楚性质1和性质2是没有冲突的,怎么对异或运算进行解释取决于哪种方便自己对运算进行处理。

    再来看a ^ b ^ a = b,a ^ b得到a和b有差别的位,在用这个结果异或a,相当于将a中把有差别的位都改变取值,改了自然就没有差别了,就成了b。所以两数交换的解释应该可以同理。

继续阅读