C 《C 標準程式庫》小結第十二章 數值

2021-07-10 21:00:30 字數 3607 閱讀 4258

(一)複數

1、複數相關演算法少,請移步科學計算庫。

2、c++中使用複數complex需要#include 。複數普通表現形式為a+bi,也可以通過polar函式轉化:

complexc1(4.0,3.0);

complexc2(polar(5.0,0.75));//極座標轉化,模和幅角

注意,complex《高精度》可以隱式轉化到低精度,但反之沒有,必須顯示。

3、complex輸入時,需要打上括號和逗號。

4、complex可以與實數、複數判斷相等,但不能比較大小。

5、函式:

函式名作用

polar

產生乙個complex。由於沒有從complex到complex《其他低精度型別》的隱式轉化,故一般用在建構函式。

conj

產生乙個共軛的複數

real

實部imag

虛部norm

絕對值的平方

arg極座標的相位角

pow,sqrt,log,sin,cos,tan,sinh, cosh,tanh

log10

10為底的對數

expe為底的冪

(二)valarray

1、valarray代表數值線性序列,#include 。作者認為設計較差,非高效能數學計算場合可以使用,高效能場合請用其他專用科學計算庫。

2、valarray與stl相容性不好,很多演算法無法使用。

3、三角函式和指數運算直接使用c++提供的數值函式就行,比如sqrt,sin。

4、valarray

的亮點就是類似於

python

的子集分割。這項操作依賴於緩式評估技術,以達到高效能。所獲得的子集只是定義,在最終需要結果的時候(operator=函式)才轉化為實際的valarray。不能直接使用slice,subset。

a)        slice切割

b)       general slice一般化切割

c)        masked subset遮蔽式子集

d)       indirect subset 間接式子集

5、valarray的子集設計並不好,下面**是錯的:

va[slice(0,4,3)] = va[slice(1,4,3)] * va[slice(2,4,3)];//錯誤!!

原因是沒有實作出,定義式的operator*函式,因此操作必須加上顯示轉化符號,將子集轉化為實際的valarray後呼叫valarray的operator*函式。

va[slice(0,4,3)] = valarray(va[slice(1,4,3)])* valarray(va[slice(2,4,3)]);

為了方便起見,我們可以定義乙個模板函式自動轉化valarray」:

template

inline std::valarrayva(constt& valarray_subset)

這裡編譯器會進行rvo(返回值優化)操作,效能比臨時的好。現在**如下:

va[slice(0,4,3)] = va(va[slice(1,4,3)]) * va(va[slice(2,4,3)]);

6、切割具備三個屬性:

a)        起始索引

b)       元素數量size

c)        元素間距stride

7、一般化切割,屬性:

a) 起始索引

b) 元素數量size

c) 元素間距stride

與切割不同,元素數量和元素間距可以是乙個陣列。**:

size_tlenvalue = ;

size_tstridevalue = ;

valarraylen(lenvalue, 2);

valarraystride(stridevalue, 2);

va[gslice(2,len. stride)];

表示從索引2開始,以10為間隔提取了2次,以3為間隔提取4次:

2,5,8,11

12,15,18,21.

這個真不好用,不深究它。

8、遮蔽式子集很簡單:

va[va>7.0&& va < 9.0];

9、間接式子集

valarrayidx;

給idx賦值。

va[idx];

簡單說就是把valarray作為子集索引了。

10、函式

函式名作用

min最小

max最大

shift(num)

被移空的元素賦初值。num為正數,向左移動

cshift(num)

迴圈移動,num為正數向左移動。

可以使用各種邏輯符號:==,!=,<, > , &&, ||

後面可以跟valarray,對每個元素進行二進位制位移

類似於eigen和vxl的東西,對每個元素呼叫op函式

超越函式: abs, pow, exp, sqrt, log, log10, sin, cos, tan, sinh, cosh, tanh, asin, acos, atan, atan2

(三)全域性性數值函式,c語言也能用

函式作用

pow求冪

exp指數

sqrt

平方根log

自然對數

log10

10為底的對數

sin正弦

cos余弦

tan正切

sinh

雙曲正弦

cosh

雙曲余弦

tanh

雙曲正切

asin

反正弦acos

反余弦atan

反正切atan2

給定平面座標的xy。商的反正切,可以返回360度角度的值,逆時針方向,從而得知目標在哪個象限。返回區間(-pi,pi]

ceil

大於浮點數的最小整數

floor

小於浮點數的最大整數

fabs

浮點數絕對值。也可用c++的abs完全代替。

fmod

浮點數取餘

frexp

double frexp( double x, int *expptr );

expptr是2為底的冪數。例子:frexp( 16.400000, &n ) = 0.512500, n = 5。驗證:

16.4 = 0.5125 * 2^5 = 0.5125 * 32

ldexp

double ldexp(double value, int exp);將浮點數乘以2的某個整數冪次方。例子:x = ldexp(4.0,3); x = 4 * 2^3 = 4 * 8 = 32.

modf

double modf(double x, double *intptr);

double fraction, integer;

fraction = modf(100000.567, &integer);

fraction = 0.567; integer = 100000。

div求int相除的商和餘數。div_t x;x = div(10,3);

x.quot = 3; x.rem =1;

srand

隨機數種子

rand

產生隨機數

12 8 第十二章小結

12.8 第十二章小結 在本章的第一部分,我們討論了 net 序列,由 ienumerable型別表示,在 f 中也稱為 seq a 我們開始討論生成序列的技術,包括高階函式 迭代器和 f 序列表示式。我們看到,序列是延遲的,能夠建立無窮序列。我們看到了乙個實際的示例,使用顏色的無窮的序列,將繪製圖...

C 《C 標準程式庫》小結第十章 特殊容器

一 stack堆疊 a lifo後進先出。一般只有三個介面有用 pop push top b 可以自己製作乙個,一般封裝deque,原因是deque釋放元素就直接釋放了記憶體,符合堆疊特性。二 queue佇列 a fifo先進先出。核心介面 push pop front back b 一般封裝deq...

瘋狂的程式設計師 第十二章

現在來看,王江應該是屬於那種成功的大學生。好多人後來都後悔 四年大學白念了,什麼也沒學到,什麼也沒做成。在他們心目中,大學四年應該像王江那樣渡過 一 成績中上,另外有那麼一兩門課特別好 二 交際廣泛,特別是跟女同學的交際,手機裡面全是妹妹的 qq上全是妹妹的頭像 三 課餘活動豐富,打球 唱歌 泡妞 ...