1. C语言的数学运算
1.1 运算符

-
/ 除 (C语言隐式类型转换规则)
左右都是整数:整除,下取整 3 / 2 = 1
左右至少有一个浮点数:结果是浮点数 3 / 2.0 = 1.5
-
⭐位运算,效率高
不同数据类型的底层都是二进制存储,即按bit位存储
int类型是32位bit,对于有符号的最大能表示2^31-1
位运算时,①先展开成二进制位表示,②只有对应的位之间有关系
位运算不支持浮点数?
没有意义。对于64位的浮点数,最高的1位是符号位S,接着的11位是指数E,剩下的52位为有效数字M。
如果按位与,前面12位运算规则是什么呢?即指数位相与结果的意义是什么呢?这就是本质了,两个浮点数相与没有数学意义啊。
位运算的核心:将当前的数据以2进制位的形式进行看待所作的运算
符号位为0正数,符号位为1负数
-
<< 左移 >> 右移
左移一位,乘2
右移一位,除2,下取整、符号不变
左边一直补符号位(最高位为符号位的有符号数)
左边强制补0(无符号数)
2. C语言的数学函数库
- 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函数 【换底公式】 log28 = log108 / log102,可以求以任何数为底数的对数值
[C] 2. 数学运算1. C语言的数学运算2. C语言的数学函数库3 随堂练习 - acos函数(反余弦函数)
[C] 2. 数学运算1. C语言的数学运算2. C语言的数学函数库3 随堂练习
- 原型在C语言编译器中可以通过编译,了解库函数最好的方式就是看原型
- abs函数头文件math.h、参数和返回值为int,与其他函数不同
-
acos函数参数是弧度值
acos(90o) — ×,acos(Π/2) — √
求Π:cos(Π) = -1,所以acos(-1) = Π
- C语言有29个函数库
3 随堂练习
3.1 求x立方根
#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 角度值转化弧度值
#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;
}
-
运算符优先级
优先级高先运算,优先级相同按结合顺序依次进行运算
() 提升优先级
-
^ 异或
是自己的逆运算;支持交换律、结合律
-
逆运算
前提:符合交换律
减法、除法不符合
减法是加法的逆运算,反之不是
除法是乘法的逆运算,反之不是 [非严格,未考虑乘数为0]
⭐2个数异或 有2种性质
- 找出两个数有差异的位,a ^ b 得到的结果中,1表示在该位两数存在差别,0表示无差别
-
将一个数按照另一个数的对应位的取值改变取值,如a ^ b (10001010 ^ 00110011),可以看成a按照b的要求改变对应位的取值(1为改变,0为不改变)故得到10111001。要清楚性质1和性质2是没有冲突的,怎么对异或运算进行解释取决于哪种方便自己对运算进行处理。
再来看a ^ b ^ a = b,a ^ b得到a和b有差别的位,在用这个结果异或a,相当于将a中把有差别的位都改变取值,改了自然就没有差别了,就成了b。所以两数交换的解释应该可以同理。