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。是以兩數交換的解釋應該可以同理。