天天看點

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

繼續閱讀