コース内容#
C 言語の数学演算#
-
-
= 代入
- 他の演算子と組み合わせて使用できます:+=、<<=、...
-
/ 割る
- 両側が整数の場合:整数除算、切り捨て
- 両側の少なくとも一方が浮動小数点数の場合:得られるのは浮動小数点数
-
() 演算の優先順位を上げる
-
⭐ビット演算、効率が高い
- コンピュータは異なるデータ型をすべて2 進数データとして保存します、つまり bit 単位で保存します
- 8bit→1byte
- int 型は 32bit で、符号付きの最大値は 2^31-1 です
- ビット演算では、①まず 2 進数で展開し、②対応するビット間にのみ関係があります
- ビット演算は浮動小数点数をサポートしませんか?
- 意味がありません。64 ビットの浮動小数点数では、最上位の 1 ビットは符号ビット S で、次の 11 ビットは指数 E、残りの 52 ビットは有効数字 M です。
- ビット AND を行う場合、最初の 12 ビットの演算ルールは何ですか?つまり、指数ビットの AND の結果の意味は何ですか?これが本質です、2 つの浮動小数点数の AND には数学的な意味がありません。
- ^ 排他的論理和
- 特徴:自分自身の逆演算;交換法則、結合法則をサポート
- 逆演算
- 前提:交換法則に従う
- 減法、除法は従わない
- 減法は加法の逆演算ですが、逆は成り立ちません
- 除法は乗法の逆演算ですが、逆は成り立ちません [厳密ではなく、乗数が 0 の場合を考慮していません]
- 前提:交換法則に従う
-
<<左シフト>> 右シフト
- 左に 1 ビットシフトすると、2 倍になります
- 右に 1 ビットシフトすると、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;
- 2 回現れる数字の配列の中から、1 回だけ現れる数字を見つけることができます
- xshell で C 言語を実行すると警告が出ません
- g++ *.cpp -Wall
- このオプションを使用すると、GCC が提供できるすべての有用な警告を発することが許可されます
- -W {warning} を使用して特定の警告をマークすることもできます。
-
- g++ *.cpp -Wall
考察点#
- 排他的論理和を使用して変数を交換することの利点は何ですか?
- 第三者の変数のメモリを節約します
- 原理を考える
- 逆演算を行うだけです
- または
- 自身と自身の排他的論理和は 0 になります
* どんな変数も 0 との排他的論理和は値が変わりません - 上記の原理を考えると、実際には +- 演算を使用することもできますか?
- a' = a + b
- b = a' - b = a
- a = a' - b = a' - a = b
- しかし、この方法ではビット演算の効率性を利用しておらず、2 つの数の和がオーバーフローしないことを保証する必要があります~
ヒント#
-
C 言語文書の日本語版- 極客学院翻訳
- C 言語には約 29 の関数ライブラリがあります
-
参考書の章
-