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#

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。