課程內容#
C 語言的數學運算#
-
-
= 赋值
- 可以與和其他運算符結合使用:+=、<<=、...
-
/ 除以
- 左右都是整數:整除,下取整
- 左右至少有一個浮點數:得到的才是浮點數
-
() 提高運算優先級
-
⭐位運算,效率高
- 計算機對於不同的數據類型,都統一按二進制數據存儲,即按 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 沒有它嚴格,控制字符可以不和類型完全一樣,應該是有類型轉換
- 代碼
-
- 巧妙地是用 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
- p-- 的運算順序是 ①p 指向的地址 - 1,②再用取該地址的值
- 異或規律
- a ^ a = 0;
- 0 ^ a = a;
- 可以在一個數字均出現兩次的數組中找有且一個只出現一次的數字
- xshell 運行 C 語言不報 warning
- g++ *.cpp -Wall
- 使用該選項,允許發出 GCC 能夠提供的所有有用的警告
- 也可以用 - W {warning} 來標記指定的警告。
-
- g++ *.cpp -Wall
思考點#
- 用異或運算進行變量交換有什麼好處?
- 節約第三方變量的內存
- 原理思考
- 逆運算即可
- 或者
- 自身與自身異或為 0
* 任何變量和 0 異或值不變 - 按上面的原理思考,其實也可以用 +- 運算來做?
- a' = a + b
- b = a' - b = a
- a = a' - b = a' - a = b
- 但是這樣做並沒有用到位運算的高效性,而且要保證兩個數的和不溢出~
Tips#
-
C 語言文檔中文版- 極客學院翻譯
- C 語言大約有 29 個函數庫
-
參考工具書章節
-