1 | <html> |
---|
2 | <head> |
---|
3 | <title>Áèáëèîòåêà àðèôìåòèêè âûñîêîé òî÷íîñòè AMP</title> |
---|
4 | <style type="text/css"> |
---|
5 | <!-- |
---|
6 | h1 { font-family: Tahoma,sans-serif; font-size : larger; } |
---|
7 | h2 { font-family: Arial,sans-serif; font-size : 11pt; } |
---|
8 | h3 { font-family: Arial,sans-serif; font-size : 9pt; } |
---|
9 | p { text-align: justify; } |
---|
10 | code { font-family: Courier New, monospace; } |
---|
11 | .cond { color:blue; } |
---|
12 | .const { color:#222222; } |
---|
13 | .func { color:#111111; font-family: Courier New, monospace; font-size : 9pt; } |
---|
14 | --> |
---|
15 | </style> |
---|
16 | </head> |
---|
17 | <body> |
---|
18 | <h1>Ââåäåíèå</h1> |
---|
19 | |
---|
20 | <p> |
---|
21 | Áèáëèîòåêà AMP (ALGLIB Muliple Precision) - ýòî îáúåêòíî-îðèåíòèðîâàííûé èíòåðôåéñ ê áèáëèîòåêå àðèôìåòèêè âûñîêîé òî÷íîñòè MPFR, ñîçäàííûé â ðàìêàõ ïðîåêòà ALGLIB (ñì. www.alglib.net è alglib.sources.ru). Äëÿ îáúÿñíåíèÿ ïðè÷èí, ïî êîòîðûì ïîòðåáîâàëîñü ñîçäàâàòü åùž îäèí èíòåðôåéñ ê MPFR, ñëåäóåò íåìíîãî ðàññêàçàòü î ïðîåêòå ALGLIB. |
---|
22 | </p> |
---|
23 | |
---|
24 | <p> |
---|
25 | Ïðîåêò ALGLIB çàêëþ÷àåòñÿ â ñîçäàíèè áèáëèîòåêè ÷èñëåííîãî àíàëèçà, â êîòîðîé êàæäûé àëãîðèòì äîñòóïåí â âèäå ïðîãðàìì íà íåñêîëüêèõ ÿçûêàõ ïðîãðàììèðîâàíèÿ.  ïðîåêòå ALGLIB ýòà çàäà÷à ðåøåíà çà ñ÷åò èñïîëüçîâàíèÿ àâòîìàòè÷åñêîãî ïåðåâîäà. Àëãîðèòìû õðàíÿòñÿ â âèäå ïñåâäîêîäà, êîòîðûé ïåðåâîäèòñÿ ïðè ïîìîùè àâòîìàòè÷åñêîãî òðàíñëÿòîðà íà òðåáóåìûé ÿçûê. Ñèíòàêñèñ ïñåâäîêîäà ïîçâîëÿåò îñóùåñòâëÿòü àâòîìàòè÷åñêèé ïåðåâîä íà íàèáîëåå ïîïóëÿðíûå ÿçûêè ïðîãðàììèðîâàíèÿ (C++, C#, Pascal è äðóãèå). Îñîáûé èíòåðåñ ïðåäñòàâëÿåò òî, ÷òî â ðÿäå ñëó÷àåâ ïðîãðàììà íà ïñåâäîêîäå ìîæåò áûòü àâòîìàòè÷åñêè ìîäèôèöèðîâàíà òàêèì îáðàçîì, ÷òî îíà ñìîæåò èñïîëüçîâàòü â ñâîåé ðàáîòå àðèôìåòèêó âûñîêîé òî÷íîñòè. Áèáëèîòåêà AMP ïðè ýòîì èñïîëüçóåòñÿ â êà÷åñòâå èíòåðôåéñà ê MPFR, çàìåíÿþùåãî ñîáîé ñòàíäàðòíûé òèï äàííûõ <code>double</code>. |
---|
26 | </p> |
---|
27 | |
---|
28 | <p> |
---|
29 | Òî, ÷òî ïðîãðàììû, èñïîëüçóþùèå AMP, èçíà÷àëüíî áûëè íàïèñàíû äëÿ ðàáîòû ñ âåùåñòâåííîé àðèôìåòèêîé 64-áèòíîé òî÷íîñòè, ïîâëèÿëî íà äèçàéí áèáëèîòåêè. Ýòèì áûëè îáóñëîâëåíû òàêèå îñîáåííîñòè, êàê îïðåäåëåíèå òî÷íîñòè íà ýòàïå êîìïèëÿöèè (â AMP òî÷íîñòü çàäàåòñÿ ïðè ïîìîùè ïàðàìåòðèçàöèè êëàññà-øàáëîíà) è çàïðåò íà îïåðàöèè ñî ñìåøàííîé òî÷íîñòüþ (íàïðèìåð, ñëîæåíèå 256-áèòíîãî è 512-áèòíîãî ÷èñåë). Ýòè îãðàíè÷åíèÿ ôóíêöèîíàëüíîñòè íåîáõîäèìû äëÿ òîãî, ÷òîáû áèáëèîòåêó áûëî ìîæíî èñïîëüçîâàòü â ïðîåêòå ALGLIB. |
---|
30 | </p> |
---|
31 | |
---|
32 | <p> |
---|
33 | Ñëåäóåò îòìåòèòü, ÷òî õîòÿ áèáëèîòåêà AMP â ïåðâóþ î÷åðåäü ïðåäíàçíà÷åíà äëÿ ïðîåêòà ALGLIB, îíà ìîæåò ïðåäñòàâëÿòü èíòåðåñ è â êà÷åñòâå "ïðîñòî èíòåðôåéñà ê MPFR".  ÷àñòíîñòè, àâòîìàòèçèðîâàííàÿ ñáîðêà ìóñîðà ìîæåò îêàçàòüñÿ ïîëåçíîé â ðÿäå ïðèëîæåíèé.  áóäóùåì ïëàíèðóåòñÿ ðàçâèâàòü áèáëèîòåêó èìåííî â ýòîì íàïðàâëåíèè, ò.ê. îòíîñÿùàÿñÿ íåïîñðåäñòâåííî ê ALGLIB ÷àñòü áèáëèîòåêè óæå äîñòàòî÷íî ïðîðàáîòàíà è íå íóæäàåòñÿ â äàëüíåéøåì ðàñøèðåíèè. |
---|
34 | </p> |
---|
35 | |
---|
36 | <h1>Ëèöåíçèÿ</h1> |
---|
37 | |
---|
38 | <p> |
---|
39 | Áèáëèîòåêà AMP äîñòóïíà íà óñëîâèÿõ òðîéíîé ëèöåíçèè MPL 1.1 / GPL 2.0 / LGPL 2.1 |
---|
40 | </p> |
---|
41 | |
---|
42 | <p> |
---|
43 | <b>Ðàçúÿñíåíèå</b>. Ïðåäîñòàâëåíèå áèáëèîòåêè íà óñëîâèÿõ òðîéíîé ëèöåíçèè îáîçíà÷àåò, ÷òî ïîëüçîâàòåëü ìîæåò èñïîëüçîâàòü AMP íà óñëîâèÿõ ëþáîé èç òðåõ ëèöåíçèé ïî ñâîåìó âûáîðó. Ïðè ðàñïðîñòðàíåíèè AMP è/èëè åž ìîäèôèêàöèé ïîëüçîâàòåëþ äîñòóïíû äâà âàðèàíòà ïîâåäåíèÿ. Âî-ïåðâûõ, îí ìîæåò ðàñïðîñòðàíÿòü åž íà òåõ æå óñëîâèÿõ òðîéíîé ëèöåíçèè, îñòàâëÿÿ çà ïîëó÷àòåëÿìè áèáëèîòåêè ïðàâî èñïîëüçîâàòü ëþáóþ èç òðåõ ðàçðåøåííûõ ëèöåíçèé ïî ñâîåìó óñìîòðåíèþ. Âî-âòîðûõ, îí èìååò ïðàâî ðàñïðîñòðàíÿòü áèáëèîòåêó íà óñëîâèÿõ ëèöåíçèè GPL 2.0 (èëè, ïî ñâîåìó âûáîðó, LGPL 2.1), çàïðåòèâ ðàñïðîñòðàíåíèå íà óñëîâèÿõ äðóãèõ ëèöåíçèé. |
---|
44 | </p> |
---|
45 | |
---|
46 | <p> |
---|
47 | Ýòè óñëîâèÿ ðàñïðîñòðàíåíèÿ ïîçâîëÿþò èñïîëüçîâàòü áèáëèîòåêó AMP êàê â ïðîïðèåòàðíûõ èëè ïðîñòî íåñâîáîäíûõ ïðîãðàììàõ (÷òî äîïóñêàåòñÿ óñëîâèÿìè ëèöåíçèè MPL), òàê è â ÏÎ, ðàñïðîñòðàíÿþùåìñÿ ïî ëèöåíçèè GPL/LGPL. Ïî ìíåíèþ àâòîðà, ýòî ñïîñîáñòâóåò ìàêñèìàëüíî øèðîêîìó ðàñïðîñòðàíåíèþ è èñïîëüçîâàíèþ áèáëèîòåêè. |
---|
48 | </p> |
---|
49 | |
---|
50 | <h1>Ïîäêëþ÷åíèå è èñïîëüçîâàíèå</h1> |
---|
51 | |
---|
52 | <p> |
---|
53 | Äëÿ èñïîëüçîâàíèÿ áèáëèîòåêè AMP íåîáõîäèìî: |
---|
54 | </p> |
---|
55 | |
---|
56 | <ul> |
---|
57 | <li>ïîäêëþ÷èòü ê ïðîåêòó áèáëèîòåêó GMP</li> |
---|
58 | <li>ïîäêëþ÷èòü ê ïðîåêòó áèáëèîòåêó MPFR</li> |
---|
59 | <li>ïîäêëþ÷èòü ê ïðîåêòó áèáëèîòåêó AP (ñì. www.alglib.net èëè alglib.sources.ru)</li> |
---|
60 | <li>ïîäêëþ÷èòü ê ïðîåêòó ãëàâíûé ìîäóëü áèáëèîòåêè amp.cpp</li> |
---|
61 | <li>âêëþ÷èòü çàãîëîâî÷íûé ôàéë amp.h, ñîäåðæàùèé âñå îáúÿâëåíèÿ, íåîáõîäèìûå äëÿ ðàáîòû áèáëèîòåêè AMP</li> |
---|
62 | </ul> |
---|
63 | |
---|
64 | <h1>Îñíîâíûå êîíöåïöèè</h1> |
---|
65 | |
---|
66 | <p> |
---|
67 | <b>Âåùåñòâåííûå ÷èñëà</b>. MPFR (è, ñëåäîâàòåëüíî, AMP) ïðàêòè÷åñêè ïîëíîñòüþ ñîîòâåòñòâóåò ñòàíäàðòó IEE-754, ñîäåðæàùåìó òðåáîâàíèÿ ê ðåàëèçàöèè âåùåñòâåííîé àðèôìåòèêè. Ïîëüçîâàòåëþ äîñòóïíû ñëåäóþùèå òèïû ÷èñåë: ïîëîæèòåëüíûé è îòðèöàòåëüíûé íóëè (signed zeros), êîíå÷íûå ÷èñëà, ïîëîæèòåëüíàÿ è îòðèöàòåëüíàÿ áåñêîíå÷íîñòè, NaN. Äåíîðìàëèçîâàííûå ÷èñëà íå ïîääåðæèâàþòñÿ. |
---|
68 | </p> |
---|
69 | |
---|
70 | <p> |
---|
71 | <b>Îïåðàöèè ñ ÷èñëàìè è îêðóãëåíèå</b>. Áèáëèîòåêà MPFR ïîääåðæèâàåò ÷åòûðå òèïà îêðóãëåíèÿ: îêðóãëåíèå ââåðõ, âíèç, ê íîëþ è ê áëèæàéøåìó ïðåäñòàâèìîìó çíà÷åíèþ. Áèáëèîòåêà AMP âñåãäà èñïîëüçóåò ðåæèì îêðóãëåíèÿ ê áëèæàéøåìó ïðåäñòàâèìîìó çíà÷åíèþ. Òàêèì îáðàçîì, âñå îïåðàöèè ñ âåùåñòâåííûìè ÷èñëàìè ïðîâîäÿòñÿ ñ èñïîëüçîâàíèåì òî÷íîãî îêðóãëåíèÿ (exact rounding). Ïîÿâëåíèå â õîäå âû÷èñëåíèé ñïåöèàëüíûõ çíà÷åíèé (áåñêîíå÷íîñòåé è <code>NaN</code>) íå ïðèâîäèò ê ãåíåðàöèè èñêëþ÷åíèÿ - âû÷èñëåíèÿ ïðîäîëæàþòñÿ â íîðìàëüíîì ðåæèìå. Îïåðàöèè ñ áåñêîíå÷íîñòÿìè è íóëÿìè ñî çíàêîì îñóùåñòâëÿþòñÿ ïî ïðàâèëàì àðèôìåòèêè ïðåäåëîâ. |
---|
72 | </p> |
---|
73 | |
---|
74 | <p> |
---|
75 | <b>Òî÷íîñòü</b>. Òî÷íîñòü âåùåñòâåííîãî ÷èñëà - ýòî ÷èñëî áèò â ìàíòèññå, âêëþ÷àÿ ñòàðøèé (íåíóëåâîé áèò). Íàïðèìåð, åñëè óñòàíîâèòü òî÷íîñòü âåùåñòâåííîãî ÷èñëà ðàâíîé 53, òî ïîëó÷èòñÿ òèï äàííûõ, èìèòèðóþùèé ñòàíäàðòíûé òèï <code>double</code>. Áèáëèîòåêà AMP ïîçâîëÿåò óñòàíàâëèâàòü â êà÷åñòâå òî÷íîñòè ëþáîå ÷èñëî, íå ìåíüøåå 32 (ðàçìåð òèïà äàííûõ <code>signed long</code>), âêëþ÷àÿ è ÷èñëà, íå ÿâëÿþùèåñÿ ñòåïåíÿìè äâîéêè. Ýòî îãðàíè÷åíèå ââåäåíî èç ñîîáðàæåíèé ñîâìåñòèìîñòè - ìíîãèå ìàòåìàòè÷åñêèå ïðîãðàììû ïîëàãàþòñÿ íà òî, ÷òî öåëîå çíà÷åíèå ìîæåò áûòü ïðèñâîåíî âåùåñòâåííîìó áåç ïîòåðè òî÷íîñòè. |
---|
76 | </p> |
---|
77 | |
---|
78 | <p> |
---|
79 | <b>Îïðåäåëåíèå òî÷íîñòè íà ýòàïå êîìïèëÿöèè</b>. Îñîáåííîñòüþ áèáëèîòåêè AMP ÿâëÿåòñÿ òî, ÷òî êëàññ, ïîçâîëÿþùèé îñóùåñòâëÿòü îïåðàöèè ñ âåùåñòâåííûìè ÷èñëàìè âûñîêîé òî÷íîñòè, ÿâëÿåòñÿ êëàññîì-øàáëîíîì, ïàðàìåòðîì êîòîðîãî ÿâëÿåòñÿ öåëîå ÷èñëî, çàäàþùåå òî÷íîñòü õðàíÿùåãîñÿ çíà÷åíèÿ. Òàêèì îáðàçîì, òî÷íîñòü, ñ êîòîðîé îñóùåñòâëÿþòñÿ âû÷èñëåíèÿ, ñòàíîâèòñÿ èçâåñòíà åùž íà ýòàïå êîìïèëÿöèè - ïðè ïàðàìåòðèçàöèè øàáëîíà, è íå ìîæåò áûòü èçìåíåíà â õîäå âûïîëíåíèÿ ïðîãðàììû. Ýòî ñóùåñòâåííîå îãðàíè÷åíèå ôóíêöèîíàëüíîñòè áèáëèîòåêè áûëî ââåäåíî ñîçíàòåëüíî. Ïðè÷èíîé ÿâëÿåòñÿ òî, ÷òî îñíîâíîå íàçíà÷åíèå áèáëèîòåêè AMP - ïðèìåíåíèå â ðàìêàõ ïðîåêòà ALGLIB.  ïðîåêòå ALGLIB áèáëèîòåêà AMP èñïîëüçóåòñÿ ïðîãðàììàìè, ÿâëÿþùèìèñÿ ðåçóëüòàòîì ðàáîòû àâòîìàòè÷åñêîãî òðàíñëÿòîðà. Ãåíåðèðóåìûé òðàíñëÿòîðîì êîä íå ñïîñîáåí ðàáîòàòü ñ âåùåñòâåííûìè ÷èñëàìè, ÷üÿ òî÷íîñòü ìåíÿåòñÿ äèíàìè÷åñêè, ïîñêîëüêó ïðè ýòîì âîçíèêàåò ðÿä ïðîáëåì (íàïðèìåð, êàêóþ òî÷íîñòü ñëåäóåò èñïîëüçîâàòü äëÿ ïðîìåæóòî÷íûõ ðåçóëüòàòîâ, åñëè îäíè ýëåìåíòû ìàòðèöû çàäàíû ñ òî÷íîñòüþ 128 áèò, à äðóãèå - ñ òî÷íîñòüþ 256 áèò). Ïî ýòîé ïðè÷èíå áûëî ðåøåíî ââåñòè âûøåóêàçàííîå îãðàíè÷åíèå. |
---|
80 | </p> |
---|
81 | |
---|
82 | <p> |
---|
83 | <b>Îïåðàíäû ñìåøàííîé òî÷íîñòè</b>. Ñ++ ïðåäîñòàâëÿåò íåñêîëüêî âåùåñòâåííûõ òèïîâ: <code>float</code>, <code>double</code>, <code>long double</code>. Ïðè ýòîì, åñëè àðãóìåíòàìè êàêîé-ëèáî îïåðàöèè ÿâëÿþòñÿ äâà ÷èñëà ðàçëè÷íîãî òèïà, òî îáû÷íî îñóùåñòâëÿåòñÿ íåÿâíîå ïðåîáðàçîâàíèå îò ìåíüøåãî òèïà ê áîëüøåìó (òàê, ñóììà <code>float</code> è <code>double</code> èìååò òèï <code>double</code>). Áèáëèîòåêà AMP íå ïîçâîëÿåò îñóùåñòâëÿòü íåÿâíîå ïðèâåäåíèå òèïîâ ïðè îïåðàöèÿõ ñ îïåðàíäàìè ñìåøàííîé òî÷íîñòè. Íàïðèìåð, ñëîæåíèå <code>amp::ampf<128></code> è <code>amp::ampf<144></code> âûçîâåò îøèáêó êîìïèëÿöèè - ïîòðåáóåòñÿ â ÿâíîé ôîðìå ïðèâåñòè îäèí èç òèïîâ ê òèïó äðóãîãî îïåðàíäà. Îò÷àñòè ýòî ïðîäèêòîâàíî îãðàíè÷åíèÿìè Ñ++ (êîòîðûå â ïðèíöèïå ìîæíî îáîéòè), îò÷àñòè - óáåæäåíèåì ðàçðàáîò÷èêà â òîì, ÷òî â ïðàêòèêå ÷èñëåííîãî àíàëèçà ïîòðåáíîñòü â ïîäîáíîé ôóíêöèîíàëüíîñòè âîçíèêàåò î÷åíü ðåäêî. |
---|
84 | </p> |
---|
85 | |
---|
86 | <p> |
---|
87 | <b>Ñáîðêà ìóñîðà</b>. Ïîñêîëüêó â MPFR ïàìÿòü ïîä âåùåñòâåííûå ÷èñëà âûäåëÿåòñÿ äèíàìè÷åñêè, èíèöèàëèçàöèÿ íîâîãî âåùåñòâåííîãî ÷èñëà çàíèìàåò ñðàâíèòåëüíî ìíîãî âðåìåíè. Äëÿ óñêîðåíèÿ ðàáîòû áèáëèîòåêà AMP íå îñâîáîæäàåò èñïîëüçîâàííûå ïåðåìåííûå, à ïîìåùàåò èõ â ñïèñîê, èç êîòîðîãî îñóùåñòâëÿåòñÿ âûáîðêà, êîãäà òðåáóåòñÿ ñîçäàòü íîâîå âåùåñòâåííîå ÷èñëî. |
---|
88 | </p> |
---|
89 | |
---|
90 | <p> |
---|
91 | <b>Îòñóòñòâèå ìíîãîïîòî÷íîñòè</b>.  íàñòîÿùåå âðåìÿ áèáëèîòåêà AMP íå ïîääåðæèâàåò ìíîãîïîòî÷íîñòü. Áèáëèîòåêà ìîæåò ðàáîòàòü â ìíîãîïîòî÷íîé ñðåäå, íî íå ìîæåò èñïîëüçîâàòüñÿ äâóìÿ è áîëåå ïîòîêàìè îäíîâðåìåííî. |
---|
92 | </p> |
---|
93 | |
---|
94 | <h1>Êëàññû èñêëþ÷åíèé</h1> |
---|
95 | |
---|
96 | <p> |
---|
97 | Áèáëèîòåêà AMP âêëþ÷àåò â ñåáÿ ñëåäóþùèå êëàññû èñêëþ÷åíèé: |
---|
98 | </p> |
---|
99 | |
---|
100 | <ol> |
---|
101 | <li><code>amp::incorrectPrecision</code> - ãåíåðèðóåòñÿ ïðè ïîïûòêå èíèöèàëèçèðîâàòü ÷èñëî ñ óêàçàíèåì íåäîïóñòèìîé òî÷íîñòè (ìåíåå 32 èëè áîëüøå îãðàíè÷åíèé, óñòàíàâëèâàåìûõ áèáëèîòåêîé MPFR)</li> |
---|
102 | <li><code>amp::invalidConversion</code> - ãåíåðèðóåòñÿ ïðè ïîïûòêå ïðèâåñòè ê öåëîìó âèäó ïðè ïîìîùè ôóíêöèé <code>trunc</code>/<code>round</code>/<code>ceil</code>/<code>floor</code> ÷èñëî, íå ïîìåùàþùååñÿ â ðàçðÿäíóþ ñåòêó òèïà äàííûõ <code>signed long</code></li> |
---|
103 | <li><code>amp::internalError</code> - ãåíåðèðóåòñÿ ïðè âíóòðåííåì ñáîå â áèáëèîòåêå AMP (â íîðìàëüíûõ óñëîâèÿõ ýòî íå äîëæíî ïðîèñõîäèòü)</li> |
---|
104 | </ol> |
---|
105 | |
---|
106 | <h1>Êëàññû amp::mpfr_record è amp::mpfr_storage</h1> |
---|
107 | |
---|
108 | <p> |
---|
109 | Ýòè êëàññû - ñëóæåáíûå êëàññû, èñïîëüçóåìûå áèáëèîòåêîé äëÿ õðàíåíèÿ óêàçàòåëÿ íà âåùåñòâåííîå ÷èñëî è êàê èíòåðôåéñ ìåíåäæåðà ïàìÿòè. Õîòÿ ýòè êëàññû äîñòóïíû ïðîãðàììèñòó, îí íå äîëæåí èñïîëüçîâàòü èõ, ïîñêîëüêó îíè íå ïðåäíàçíà÷åíû äëÿ èñïîëüçîâàíèÿ çà ïðåäåëàìè áèáëèîòåêè AMP. Ïðàâèëà ðàáîòû ñ ýòèìè êëàññàìè íå äîêóìåíòèðîâàíû, à íåñîáëþäåíèå ýòèõ ïðàâèë ñïîñîáíî ðàçðóøèòü ñèñòåìó âûäåëåíèÿ ïàìÿòè èëè íàðóøèòü íîðìàëüíûé ïðîöåññ âû÷èñëåíèé. |
---|
110 | </p> |
---|
111 | |
---|
112 | <h1>Êëàññ amp::ampf è îïåðàöèè ñ íèì</h1> |
---|
113 | |
---|
114 | <h2>Îáùèå ïðèíöèïû</h2> |
---|
115 | |
---|
116 | <p> |
---|
117 | Êëàññ amp::ampf ÿâëÿåòñÿ êëàññîì-øàáëîíîì, èíêàïñóëèðóþùèì âåùåñòâåííîå ÷èñëî â ôîðìàòå áèáëèîòåêè MPFR. Êëàññ ïîëíîñòüþ áåðåò íà ñåáÿ òàêèå ôóíêöèè, êàê âûäåëåíèå ïàìÿòè äëÿ âåùåñòâåííîãî ÷èñëà, îñâîáîæäåíèå ïàìÿòè è óáîðêà ìóñîðà. Äëÿ îáúåêòîâ ýòîãî òèïà îïðåäåëåíû àðèôìåòè÷åñêèå îïåðàöèè è ðÿä ôóíêöèé, êîïèðóþùèõ ôóíêöèîíàëüíîñòü ñòàíäàðòíîé áèáëèîòåêè ÿçûêà Ñ.  áîëüøèíñòâå ñëó÷àåâ, êîä, èñïîëüçóþùèé êëàññ <code>amp::ampf</code>, ïî÷òè íå îòëè÷àåòñÿ îò êîäà, ðàáîòàþùåãî ñ âåùåñòâåííûìè ÷èñëàìè. |
---|
118 | </p> |
---|
119 | |
---|
120 | <h2>×ëåíû êëàññà amp::ampf</h2> |
---|
121 | |
---|
122 | <pre> |
---|
123 | <code> |
---|
124 | <b>template</b><<b>unsigned</b> <b>int</b> Precision> |
---|
125 | <b>class</b> ampf |
---|
126 | { |
---|
127 | <b>public</b>: |
---|
128 | ~ampf(); |
---|
129 | |
---|
130 | ampf (); |
---|
131 | ampf (<b>long double</b> v); |
---|
132 | ampf (<b>double</b> v); |
---|
133 | ampf (<b>float</b> v); |
---|
134 | ampf (<b>signed long</b> v); |
---|
135 | ampf (<b>unsigned long</b> v); |
---|
136 | ampf (<b>signed int</b> v); |
---|
137 | ampf (<b>unsigned int</b> v); |
---|
138 | ampf (<b>signed short</b> v); |
---|
139 | ampf (<b>unsigned short</b> v); |
---|
140 | ampf (<b>signed char</b> v); |
---|
141 | ampf (<b>unsigned char</b> v); |
---|
142 | ampf (<b>const</b> std::string &s); |
---|
143 | ampf (<b>const char</b> *s); |
---|
144 | |
---|
145 | ampf(<b>const</b> ampf& r); |
---|
146 | <b>template</b><<b>unsigned int</b> Precision2> |
---|
147 | ampf(<b>const</b> ampf<Precision2>& r); |
---|
148 | |
---|
149 | ampf& <b>operator</b>= (<b>long double</b> v); |
---|
150 | ampf& <b>operator</b>= (<b>double</b> v); |
---|
151 | ampf& <b>operator</b>= (<b>float</b> v); |
---|
152 | ampf& <b>operator</b>= (<b>signed long</b> v); |
---|
153 | ampf& <b>operator</b>= (<b>unsigned long</b> v); |
---|
154 | ampf& <b>operator</b>= (<b>signed int</b> v); |
---|
155 | ampf& <b>operator</b>= (<b>unsigned int</b> v); |
---|
156 | ampf& <b>operator</b>= (<b>signed short</b> v); |
---|
157 | ampf& <b>operator</b>= (<b>unsigned short</b> v); |
---|
158 | ampf& <b>operator</b>= (<b>signed char</b> v); |
---|
159 | ampf& <b>operator</b>= (<b>unsigned char</b> v); |
---|
160 | ampf& <b>operator</b>= (<b>const char</b> *s); |
---|
161 | ampf& <b>operator</b>= (<b>const</b> std::string &s); |
---|
162 | ampf& <b>operator</b>= (<b>const</b> ampf& r); |
---|
163 | <b>template</b><<b>unsigned int</b> Precision2> |
---|
164 | ampf& <b>operator</b>= (<b>const</b> ampf<Precision2>& r); |
---|
165 | |
---|
166 | <b>template</b><<b>class</b> T> |
---|
167 | ampf& <b>operator</b>+=(<b>const</b> T& v); |
---|
168 | <b>template</b><<b>class</b> T> |
---|
169 | ampf& <b>operator-</b>=(<b>const</b> T& v); |
---|
170 | <b>template</b><class T> |
---|
171 | ampf& <b>operator</b>*=(<b>const</b> T& v); |
---|
172 | <b>template</b><class T> |
---|
173 | ampf& <b>operator</b>/=(<b>const</b> T& v); |
---|
174 | |
---|
175 | mpfr_srcptr getReadPtr() <b>const</b>; |
---|
176 | mpfr_ptr getWritePtr(); |
---|
177 | |
---|
178 | <b>bool</b> isFiniteNumber() <b>const</b>; |
---|
179 | <b>bool</b> isPositiveNumber() <b>const</b>; |
---|
180 | <b>bool</b> isZero() <b>const</b>; |
---|
181 | <b>bool</b> isNegativeNumber() <b>const</b>; |
---|
182 | <b>const</b> ampf getUlpOf(); |
---|
183 | |
---|
184 | <b>double</b> toDouble() <b>const</b>; |
---|
185 | std::string toHex() <b>const</b>; |
---|
186 | std::string toDec() <b>const</b>; |
---|
187 | |
---|
188 | <b>static const</b> ampf getUlpOf(<b>const</b> ampf &x); |
---|
189 | <b>static const</b> ampf getUlp(); |
---|
190 | <b>static const</b> ampf getUlp256(); |
---|
191 | <b>static const</b> ampf getUlp512(); |
---|
192 | <b>static const</b> ampf getMaxNumber(); |
---|
193 | <b>static const</b> ampf getMinNumber(); |
---|
194 | <b>static const</b> ampf getAlgoPascalEpsilon(); |
---|
195 | <b>static const</b> ampf getAlgoPascalMaxNumber(); |
---|
196 | <b>static const</b> ampf getAlgoPascalMinNumber(); |
---|
197 | <b>static const</b> ampf getRandom(); |
---|
198 | }; |
---|
199 | </code> |
---|
200 | </pre> |
---|
201 | |
---|
202 | <h1>Îáúÿâëåíèå ïåðåìåííûõ è èíèöèàëèçàöèÿ</h1> |
---|
203 | |
---|
204 | <p> |
---|
205 | Êëàññ <code>amp::ampf</code> ÿâëÿåòñÿ êëàññîì-øàáëîíîì, ïàðàìåòðèçèðóåìûì ïî òî÷íîñòè õðàíÿùåãîñÿ â íåì âåùåñòâåííîãî çíà÷åíèÿ. Òàêèì îáðàçîì, ïåðåä èñïîëüçîâàíèåì ýòîãî êëàññà íåîáõîäèìî îïðåäåëèòü, êàêàÿ èìåííî òî÷íîñòü òðåáóåòñÿ. Äëÿ èíèöèàëèçàöèè êëàññà îïðåäåëåí ðÿä êîíñòðóêòîðîâ, ïðèíèìàþùèõ êàê îáúåêòû òîãî æå êëàññà, òàê è öåëûå ÷èñëà, âåùåñòâåííûå ÷èñëà ñòàíäàðòíûõ òèïîâ (<code>float</code>, <code>double</code>, <code>long double</code>) è ñòðîêè, â êîòîðûõ ÷èñëî çàïèñàíî â äðîáíîé (íàïðèìåð, <code>"12.34"</code>) èëè ýêñïîíåíöèàëüíîé ôîðìå, ïðè ýòîì ìàíòèññà ìîæåò áûòü êàê â äåñÿòè÷íîé ñèñòåìå èñ÷èñëåíèÿ, òàê è â øåñòíàäöàòåðè÷íîé ñèñòåìå (ñì. îïèñàíèå áèáëèîòåêè MPFR). |
---|
206 | </p> |
---|
207 | |
---|
208 | <p> |
---|
209 | Ïðèìåðû: |
---|
210 | </p> |
---|
211 | |
---|
212 | <pre> |
---|
213 | <code> |
---|
214 | <b>int</b> i = 3; |
---|
215 | <b>double</b> d = 2.5; |
---|
216 | amp::ampf<128> a(i), b(d), c("2.33"); |
---|
217 | a = "1.56E-3"; |
---|
218 | b = a; |
---|
219 | </code> |
---|
220 | </pre> |
---|
221 | |
---|
222 | <h2>Ïðåîáðàçîâàíèå â òåêñòîâóþ ôîðìó</h2> |
---|
223 | |
---|
224 | <p> |
---|
225 | Äëÿ ïðåîáðàçîâàíèÿ ÷èñëà â òåêñòîâóþ ôîðìó ñëóæàò ôóíêöèè-÷ëåíû <code>toDec()</code> è <code>toHex()</code>. Îíè âîçâðàùàþò ýêñïîíåíöèàëüíîå ïðåäñòàâëåíèå ÷èñëà â äåñÿòè÷íîé è øåñòíàäöàòåðè÷íîé ñèñòåìå èñ÷èñëåíèÿ (ïðè ýòîì øåñòíàäöàòåðè÷íîå ïðåîáðàçîâàíèå îñóùåñòâëÿåòñÿ áûñòðåå, ÷åì äåñÿòè÷íîå, ÷òî äåëàåò åãî ïðåäïî÷òèòåëüíûì â òåõ ñëó÷àÿõ, êîãäà òðåáóåòñÿ ïîâûøåííîå áûñòðîäåéñòâèå). Êàêèå-ëèáî âîçìîæíîñòè ïî ôîðìàòèðîâàíèþ ðåçóëüòàòà îòñóòñòâóþò: ÷èñëî âûäàåòñÿ ñ ìàêñèìàëüíûì êîëè÷åñòâîì çíà÷àùèõ öèôð. |
---|
226 | </p> |
---|
227 | |
---|
228 | <p> |
---|
229 | Ïðèìåð: |
---|
230 | </p> |
---|
231 | |
---|
232 | <pre> |
---|
233 | <code> |
---|
234 | amp::ampf<128> a; |
---|
235 | a = "11"; |
---|
236 | printf("%s\n", amp::sqrt(a).toDec().c_str()); |
---|
237 | </code> |
---|
238 | </pre> |
---|
239 | |
---|
240 | <h2>Ïðîâåðêà ñâîéñòâ</h2> |
---|
241 | |
---|
242 | <p> |
---|
243 | Ôóíêöèè-÷ëåíû <code>isFiniteNumber()</code>, <code>isPositiveNumber()</code>, <code>isZero()</code>, <code>isNegativeNumber()</code> ïîçâîëÿþò ïðîâåðèòü, ÿâëÿåòñÿ ëè ÷èñëî êîíå÷íûì çíà÷åíèåì (â ïðîòèâîïîëîæíîñòü îäíèìó èç ñïåöèàëüíûõ çíà÷åíèé), ïîëîæèòåëüíûì ÷èñëîì, íóëåì èëè îòðèöàòåëüíûì ÷èñëîì. |
---|
244 | </p> |
---|
245 | |
---|
246 | <h2>Èíôîðìàöèîííûå ôóíêöèè</h2> |
---|
247 | |
---|
248 | <p> |
---|
249 | Ðÿä ôóíêöèé ïðåäíàçíà÷åí äëÿ ïîëó÷åíèÿ èíôîðìàöèè î ÷èñëîâûõ ñâîéñòâàõ òîãî èëè èíîãî òèïà äàííûõ: |
---|
250 | </p> |
---|
251 | |
---|
252 | <ul> |
---|
253 | <li>ôóíêöèÿ-÷ëåí <code>getUlpOf()</code> ïîçâîëÿåò ïîëó÷èòü çíà÷åíèå åäèíèöû â ìëàäøåì ðàçðÿäå ìàíòèññû (ulp, Unit in the Last Place) ÷èñëà, äëÿ êîòîðîãî îíà âûçâàíà (ýòî ïîíÿòèå ïî ñìûñëó áëèçêî ê ìàøèííîé òî÷íîñòè). Ñòàòè÷åñêàÿ ôóíêöèÿ <code>getUlpOf()</code> èìååò òîò æå ôóíêöèîíàë.</li> |
---|
254 | <li>ñòàòè÷åñêàÿ ôóíêöèÿ <code>getUlp()</code> ïî ñìûñëó ýêâèâàëåíòíà <code>amp::ampf<Precision>::getUlpOf(1)</code></li> |
---|
255 | <li>ñòàòè÷åñêàÿ ôóíêöèÿ <code>getMaxNumber()</code> âîçâðàùàåò ìàêñèìàëüíîå ïîëîæèòåëüíîå ÷èñëî, ïðåäñòàâèìîå ïðè ïîìîùè ýòîãî òèïà äàííûõ</li> |
---|
256 | <li>ñòàòè÷åñêàÿ ôóíêöèÿ <code>getMinNumber()</code> âîçâðàùàåò ìèíèìàëüíîå ïîëîæèòåëüíîå ÷èñëî, ïðåäñòàâèìîå ïðè ïîìîùè ýòîãî òèïà äàííûõ</li> |
---|
257 | <li>ôóíêöèè <code>getAlgoPascalEpsilon()</code>, <code>getAlgoPascalMaxNumber()</code>, <code>getAlgoPascalMinNumber()</code> ïî ñìûñëó ñõîæè ñî ñâîèìè àíàëîãàìè, íî âîçâðàùàþò çíà÷åíèÿ "ñ çàïàñîì íàäåæíîñòè". Ýòè ôóíêöèè èñïîëüçóþòñÿ ïðîãðàììàìè ïðîåêòà ALGLIB.</li> |
---|
258 | </ul> |
---|
259 | |
---|
260 | <h2>Äîñòóï ê óêàçàòåëþ <code>mpfr_t</code></h2> |
---|
261 | |
---|
262 | <p> |
---|
263 | Äîñòóï ê óêàçàòåëþ <code>mpfr_t</code> ïðåäîñòàâëÿþò äâå ôóíêöèè: <code>getReadPtr()</code> è <code>getWritePtr()</code>. Ôóíêöèÿ <code>getReadPtr()</code> ïîçâîëÿåò ïîëó÷èòü óêàçàòåëü òîëüêî äëÿ ÷òåíèÿ, êîòîðûé ìîæíî ïåðåäàâàòü â ôóíêöèè áèáëèîòåêè MPFR â êà÷åñòâå àðãóìåíòà. Ôóíêöèÿ <code>getWritePtr()</code> ïîçâîëÿåò ïîëó÷èòü óêàçàòåëü äëÿ çàïèñè, êîòîðûé ìîæíî ïåðåäàâàòü â ôóíêöèè áèáëèîòåêè MPFR â êà÷åñòâå ìåñòà äëÿ ñîõðàíåíèÿ ðåçóëüòàòà âû÷èñëåíèé. |
---|
264 | </p> |
---|
265 | |
---|
266 | <p> |
---|
267 | Ñëåäóåò îòìåòèòü, ÷òî áèáëèîòåêà AMP èñïîëüçóåò òåõíèêó copy-on-write, òî åñòü óêàçàòåëü, ïîëó÷åííûé ìåòîäîì <code>getReadPtr()</code> ìîæåò áûòü îáùèì äëÿ íåñêîëüêèõ îáúåêòîâ. Òàêèì îáðàçîì, óêàçàòåëü, ïîëó÷åííûé ìåòîäîì <code>getReadPtr()</code> íè ïðè êàêèõ óñëîâèÿõ íå äîëæåí èñïîëüçîâàòüñÿ â îïåðàöèÿõ, êîòîðûå ìîãóò ìîäèôèöèðîâàòü åãî ñîäåðæèìîå. |
---|
268 | </p> |
---|
269 | |
---|
270 | <p> |
---|
271 | Óêàçàòåëü, ïîëó÷åííûé ìåòîäîì <code>getWritePtr()</code>, ìîæåò áûòü èñïîëüçîâàí â îïåðàöèÿõ, ìåíÿþùèõ åãî ñîäåðæèìîå, íî ýòè îïåðàöèè íå äîëæíû ìåíÿòü åãî òî÷íîñòü. Ñëåäóåò ó÷èòûâàòü, ÷òî èç-çà èñïîëüçîâàíèÿ òåõíèêè copy-on-write, óêàçàòåëü, ïîëó÷åííûé ïðè âûçîâå <code>getWritePtr()</code>, ìîæåò îòëè÷àòüñÿ îò óêàçàòåëÿ, ïîëó÷åííîãî ðàíåå ïðè âûçîâå <code>getReadPtr()</code>. |
---|
272 | </p> |
---|
273 | |
---|
274 | <h2>Ãåíåðàöèÿ ñëó÷àéíûõ ÷èñåë</h2> |
---|
275 | |
---|
276 | <p> |
---|
277 | Äëÿ ãåíåðàöèè ñëó÷àéíûõ ÷èñåë ñëóæèò ñòàòè÷åñêàÿ ôóíêöèÿ <code>getRandom()</code>. Ïðè ïåðâîì âûçîâå ýòà ôóíêöèÿ èíèöèàëèçèðóåò ãåíåðàòîð ñëó÷àéíûõ ÷èñåë èñïîëüçóÿ ñèñòåìíîå âðåìÿ. |
---|
278 | </p> |
---|
279 | |
---|
280 | <h2>Àðèôìåòè÷åñêèå îïåðàöèè</h2> |
---|
281 | |
---|
282 | <p> |
---|
283 | Êëàññ <code>amp::ampf</code> ïåðåîïðåäåëÿåò îïåðàöèè ñðàâíåíèÿ, ñëîæåíèÿ, âû÷èòàíèÿ, óìíîæåíèÿ è äåëåíèÿ. Ðåçóëüòàò îêðóãëÿåòñÿ ïî ïðàâèëàì òî÷íîãî îêðóãëåíèÿ (exact rounding). Îïåðàíäàìè ìîãóò áûòü äâà îáúåêòà <code>amp::ampf</code> îäíîé è òîé æå òî÷íîñòè.  âûðàæåíèè äîïóñêàåòñÿ ñìåøèâàòü îáúåêòû òèïà <code>amp::ampf</code> è ñòàíäàðòíûå òèïû äàííûõ. Ñìåøèâàòü îáúåêòû òèïà <code>amp::ampf</code> ñ ðàçíîé òî÷íîñòüþ ìîæíî, òîëüêî åñëè îäèí èç îïåðàíäîâ ÿâíûì îáðàçîì ïðèâîäèòñÿ ê òèïó äðóãîãî. |
---|
284 | </p> |
---|
285 | |
---|
286 | <p> |
---|
287 | Ïðèìåð: |
---|
288 | </p> |
---|
289 | |
---|
290 | <pre> |
---|
291 | <code> |
---|
292 | amp::ampf<128> a(3), b(4), c(99); |
---|
293 | amp::ampf<256> d(1); |
---|
294 | |
---|
295 | a = b+c; <i>//</i> |
---|
296 | b = c+2.3; <i>// äîïóñòèìûå âûðàæåíèÿ</i> |
---|
297 | c = (2*a-5)/b; <i>//</i> |
---|
298 | |
---|
299 | a = b+d; <i>// âûçîâåò îøèáêó ïðè êîìïèëÿöèè -</i> |
---|
300 | <i>// àðãóìåíòû èìåþò ðàçíûé òèï</i> |
---|
301 | |
---|
302 | a = b + amp::ampf<128>(d); <i>// òàê ïðàâèëüíî</i> |
---|
303 | |
---|
304 | a = d; <i>// ýòî òîæå äîïóñòèìî</i> |
---|
305 | </code> |
---|
306 | </pre> |
---|
307 | |
---|
308 | <h2>Ìàòåìàòè÷åñêèå ôóíêöèè</h2> |
---|
309 | |
---|
310 | <p> |
---|
311 | Âñå ïðèâåäåííûå â ýòîì ðàçäåëå ôóíêöèè ÿâëÿþòñÿ ÷ëåíàìè ïðîñòðàíñòâà èìåí <code>amp</code>. Òàêèì îáðàçîì, ïðè âûçîâå, íàïðèìåð, ôóíêöèè <code>sqr</code>, ñëåäóåò ïèñàòü <code>amp::sqr</code>. Åñëè ÿâíî íå óêàçàíî èíîå, òî ðåçóëüòàò îêðóãëÿåòñÿ ïî ïðàâèëàì òî÷íîãî îêðóãëåíèÿ. |
---|
312 | </p> |
---|
313 | |
---|
314 | <p> |
---|
315 | <span class=func> |
---|
316 | <b>template</b><<b>unsigned int</b> Precision><br> |
---|
317 | <b>const</b> ampf<Precision> sqr(<b>const</b> ampf<Precision> &x)<br> |
---|
318 | </span> |
---|
319 | Ýòà ôóíêöèÿ ñëóæèò äëÿ âîçâåäåíèÿ ÷èñëà â êâàäðàò. |
---|
320 | </p> |
---|
321 | |
---|
322 | <p> |
---|
323 | <span class=func> |
---|
324 | <b>template</b><<b>unsigned</b> <b>int</b> Precision><br> |
---|
325 | <b>const</b> <b>int</b> sign(<b>const</b> ampf<Precision> &x)<br> |
---|
326 | </span> |
---|
327 | Ýòà ôóíêöèÿ âîçâðàùàåò <code>+1</code>, åñëè àðãóìåíò ïîëîæèòåëåí, <code>-1</code>, åñëè îí îòðèöàòåëåí, <code>0</code>, åñëè îí ðàâåí íîëþ. |
---|
328 | </p> |
---|
329 | |
---|
330 | <p> |
---|
331 | <span class=func> |
---|
332 | <b>template</b><<b>unsigned</b> <b>int</b> Precision><br> |
---|
333 | <b>const</b> ampf<Precision> abs(<b>const</b> ampf<Precision> &x)<br> |
---|
334 | </span> |
---|
335 | Ýòà ôóíêöèÿ âîçâðàùàåò ìîäóëü ÷èñëà. |
---|
336 | </p> |
---|
337 | |
---|
338 | |
---|
339 | <p> |
---|
340 | <span class=func> |
---|
341 | <b>template</b><<b>unsigned</b> <b>int</b> Precision><br> |
---|
342 | <b>const</b> ampf<Precision> maximum(<b>const</b> ampf<Precision> &x, <b>const</b> ampf<Precision> &y)<br> |
---|
343 | </span> |
---|
344 | Ýòà ôóíêöèÿ âîçâðàùàåò áîëüøåå èç äâóõ ÷èñåë. |
---|
345 | </p> |
---|
346 | |
---|
347 | <p> |
---|
348 | <span class=func> |
---|
349 | <b>template</b><<b>unsigned</b> <b>int</b> Precision><br> |
---|
350 | <b>const</b> ampf<Precision> minimum(<b>const</b> ampf<Precision> &x, <b>const</b> ampf<Precision> &y)<br> |
---|
351 | </span> |
---|
352 | Ýòà ôóíêöèÿ âîçâðàùàåò ìåíüøåå èç äâóõ ÷èñåë. |
---|
353 | </p> |
---|
354 | |
---|
355 | <p> |
---|
356 | <span class=func> |
---|
357 | <b>template</b><<b>unsigned</b> <b>int</b> Precision><br> |
---|
358 | <b>const</b> ampf<Precision> sqrt(<b>const</b> ampf<Precision> &x)<br> |
---|
359 | </span> |
---|
360 | Ýòà ôóíêöèÿ âîçâðàùàåò êâàäðàòíûé êîðåíü. |
---|
361 | </p> |
---|
362 | |
---|
363 | <p> |
---|
364 | <span class=func> |
---|
365 | <b>template</b><<b>unsigned</b> <b>int</b> Precision><br> |
---|
366 | <b>const</b> <b>signed</b> <b>long</b> trunc(<b>const</b> ampf<Precision> &x)<br> |
---|
367 | </span> |
---|
368 | Ýòà ôóíêöèÿ îêðóãëÿåò ÷èñëî â ñòîðîíó íîëÿ è âîçâðàùàåò çíà÷åíèå òèïà <code>signed long</code>. Åñëè ðåçóëüòàò îêðóãëåíèÿ íå ïîìåùàåòñÿ â ðàçðÿäíóþ ñåòêó, òî ãåíåðèðóåòñÿ èñêëþ÷åíèå <code>amp::invalidConversion</code>. |
---|
369 | </p> |
---|
370 | |
---|
371 | <p> |
---|
372 | <span class=func> |
---|
373 | <b>template</b><<b>unsigned</b> <b>int</b> Precision><br> |
---|
374 | <b>const</b> ampf<Precision> frac(<b>const</b> ampf<Precision> &x)<br> |
---|
375 | </span> |
---|
376 | Ýòà ôóíêöèÿ âîçâðàùàåò äðîáíóþ ÷àñòü ÷èñëà. Äðîáíàÿ ÷àñòü îïðåäåëÿåòñÿ, êàê <code>x-trunc(x)</code>. |
---|
377 | </p> |
---|
378 | |
---|
379 | <p> |
---|
380 | <span class=func> |
---|
381 | <b>template</b><<b>unsigned</b> <b>int</b> Precision><br> |
---|
382 | <b>const</b> <b>signed</b> <b>long</b> floor(<b>const</b> ampf<Precision> &x)<br> |
---|
383 | </span> |
---|
384 | Ýòà ôóíêöèÿ îêðóãëÿåò ÷èñëî âíèç (â ñòîðîíó ìèíóñ áåñêîíå÷íîñòè) è âîçâðàùàåò çíà÷åíèå òèïà <code>signed long</code>. Åñëè ðåçóëüòàò îêðóãëåíèÿ íå ïîìåùàåòñÿ â ðàçðÿäíóþ ñåòêó, òî ãåíåðèðóåòñÿ èñêëþ÷åíèå <code>amp::invalidConversion</code>. |
---|
385 | </p> |
---|
386 | |
---|
387 | <p> |
---|
388 | <span class=func> |
---|
389 | <b>template</b><<b>unsigned</b> <b>int</b> Precision><br> |
---|
390 | <b>const</b> <b>signed</b> <b>long</b> ceil(<b>const</b> ampf<Precision> &x)<br> |
---|
391 | </span> |
---|
392 | Ýòà ôóíêöèÿ îêðóãëÿåò ÷èñëî ââåðõ (â ñòîðîíó ïëþñ áåñêîíå÷íîñòè) è âîçâðàùàåò çíà÷åíèå òèïà <code>signed long</code>. Åñëè ðåçóëüòàò îêðóãëåíèÿ íå ïîìåùàåòñÿ â ðàçðÿäíóþ ñåòêó, òî ãåíåðèðóåòñÿ èñêëþ÷åíèå <code>amp::invalidConversion</code>. |
---|
393 | </p> |
---|
394 | |
---|
395 | <p> |
---|
396 | <span class=func> |
---|
397 | <b>template</b><<b>unsigned</b> <b>int</b> Precision><br> |
---|
398 | <b>const</b> <b>signed</b> <b>long</b> round(<b>const</b> ampf<Precision> &x)<br> |
---|
399 | </span> |
---|
400 | Ýòà ôóíêöèÿ îêðóãëÿåò ÷èñëî ê áëèæàéøåìó öåëîìó è âîçâðàùàåò çíà÷åíèå òèïà <code>signed long</code>. Àðãóìåíò, ðàñïîëàãàþùèéñÿ òî÷íî íà ãðàíèöå, îêðóãëÿåòñÿ â ñòîðîíó áåñêîíå÷íîñòè. Åñëè ðåçóëüòàò îêðóãëåíèÿ íå ïîìåùàåòñÿ â ðàçðÿäíóþ ñåòêó, òî ãåíåðèðóåòñÿ èñêëþ÷åíèå <code>amp::invalidConversion</code>. |
---|
401 | </p> |
---|
402 | |
---|
403 | <p> |
---|
404 | <span class=func> |
---|
405 | <b>template</b><<b>unsigned</b> <b>int</b> Precision><br> |
---|
406 | <b>const</b> ampf<Precision> frexp2(<b>const</b> ampf<Precision> &x, mp_exp_t *exponent)<br> |
---|
407 | </span> |
---|
408 | Ýòà ôóíêöèÿ ðàçäåëÿåò ÷èñëî íà ìàíòèññó è ýêñïîíåíòó ïî îñíîâàíèþ äâà. Åñëè àðãóìåíò ðàâåí íîëþ, òî ìàíòèññà è ýêñïîíåíòà ñ÷èòàþòñÿ ðàâíûìè íîëþ. Åñëè àðãóìåíò íå ÿâëÿåòñÿ êîíå÷íûì ÷èñëîì, òî ãåíåðèðóåòñÿ èñêëþ÷åíèå <code>amp::invalidConversion</code>. |
---|
409 | </p> |
---|
410 | |
---|
411 | <p> |
---|
412 | <span class=func> |
---|
413 | <b>template</b><<b>unsigned</b> <b>int</b> Precision><br> |
---|
414 | <b>const</b> ampf<Precision> ldexp2(<b>const</b> ampf<Precision> &x, mp_exp_t exponent)<br> |
---|
415 | </span> |
---|
416 | Ýòà ôóíêöèÿ óìíîæàåò ïåðåäàííûé àðãóìåíò íà äâà â ñòåïåíè <code>exponent</code>. |
---|
417 | </p> |
---|
418 | |
---|
419 | <p> |
---|
420 | <span class=func> |
---|
421 | <b>template</b><<b>unsigned</b> <b>int</b> Precision><br> |
---|
422 | <b>const</b> ampf<Precision> pi()<br> |
---|
423 | </span> |
---|
424 | Ýòà ôóíêöèÿ âîçâðàùàåò êîíñòàíòó <code>Pi</code>. |
---|
425 | </p> |
---|
426 | |
---|
427 | <p> |
---|
428 | <span class=func> |
---|
429 | <b>template</b><<b>unsigned</b> <b>int</b> Precision><br> |
---|
430 | <b>const</b> ampf<Precision> halfpi()<br> |
---|
431 | </span> |
---|
432 | Ýòà ôóíêöèÿ âîçâðàùàåò ïîëîâèíó êîíñòàíòû <code>Pi</code>. |
---|
433 | </p> |
---|
434 | |
---|
435 | <p> |
---|
436 | <span class=func> |
---|
437 | <b>template</b><<b>unsigned</b> <b>int</b> Precision><br> |
---|
438 | <b>const</b> ampf<Precision> twopi()<br> |
---|
439 | </span> |
---|
440 | Ýòà ôóíêöèÿ âîçâðàùàåò óäâîåííóþ êîíñòàíòó <code>Pi</code>. |
---|
441 | </p> |
---|
442 | |
---|
443 | <p> |
---|
444 | <span class=func> |
---|
445 | <b>template</b><<b>unsigned</b> <b>int</b> Precision><br> |
---|
446 | <b>const</b> ampf<Precision> sin(<b>const</b> ampf<Precision> &x)<br> |
---|
447 | </span> |
---|
448 | Ýòà ôóíêöèÿ âîçâðàùàåò ñèíóñ àðãóìåíòà. |
---|
449 | </p> |
---|
450 | |
---|
451 | <p> |
---|
452 | <span class=func> |
---|
453 | <b>template</b><<b>unsigned</b> <b>int</b> Precision><br> |
---|
454 | <b>const</b> ampf<Precision> cos(<b>const</b> ampf<Precision> &x)<br> |
---|
455 | </span> |
---|
456 | Ýòà ôóíêöèÿ âîçâðàùàåò êîñèíóñ àðãóìåíòà. |
---|
457 | </p> |
---|
458 | |
---|
459 | <p> |
---|
460 | <span class=func> |
---|
461 | <b>template</b><<b>unsigned</b> <b>int</b> Precision><br> |
---|
462 | <b>const</b> ampf<Precision> tan(<b>const</b> ampf<Precision> &x)<br> |
---|
463 | </span> |
---|
464 | Ýòà ôóíêöèÿ âîçâðàùàåò òàíãåíñ àðãóìåíòà. |
---|
465 | </p> |
---|
466 | |
---|
467 | <p> |
---|
468 | <span class=func> |
---|
469 | <b>template</b><<b>unsigned</b> <b>int</b> Precision><br> |
---|
470 | <b>const</b> ampf<Precision> asin(<b>const</b> ampf<Precision> &x)<br> |
---|
471 | </span> |
---|
472 | Ýòà ôóíêöèÿ âîçâðàùàåò àðêñèíóñ àðãóìåíòà. |
---|
473 | </p> |
---|
474 | |
---|
475 | <p> |
---|
476 | <span class=func> |
---|
477 | <b>template</b><<b>unsigned</b> <b>int</b> Precision><br> |
---|
478 | <b>const</b> ampf<Precision> acos(<b>const</b> ampf<Precision> &x)<br> |
---|
479 | </span> |
---|
480 | Ýòà ôóíêöèÿ âîçâðàùàåò àðêêîñèíóñ àðãóìåíòà. |
---|
481 | </p> |
---|
482 | |
---|
483 | <p> |
---|
484 | <span class=func> |
---|
485 | <b>template</b><<b>unsigned</b> <b>int</b> Precision><br> |
---|
486 | <b>const</b> ampf<Precision> atan(<b>const</b> ampf<Precision> &x)<br> |
---|
487 | </span> |
---|
488 | Ýòà ôóíêöèÿ âîçâðàùàåò àðêòàíãåíñ àðãóìåíòà. |
---|
489 | </p> |
---|
490 | |
---|
491 | <p> |
---|
492 | <span class=func> |
---|
493 | <b>template</b><<b>unsigned</b> <b>int</b> Precision><br> |
---|
494 | <b>const</b> ampf<Precision> atan2(<b>const</b> ampf<Precision> &y, <b>con</b>st ampf<Precision> &x)<br> |
---|
495 | </span> |
---|
496 | Ýòà ôóíêöèÿ âîçâðàùàåò àðêòàíãåíñ ÷èñëà, ðàâíîãî îòíîøåíèþ àðãóìåíòîâ <code>y/x</code>. Ôóíêöèÿ âîçâðàùàåò êîððåêòíûé ðåçóëüòàò, äàæå åñëè <code>x</code> ðàâíî <code>0</code>. |
---|
497 | </p> |
---|
498 | |
---|
499 | <p> |
---|
500 | <span class=func> |
---|
501 | <b>template</b><<b>unsigned</b> <b>int</b> Precision><br> |
---|
502 | <b>const</b> ampf<Precision> log(<b>const</b> ampf<Precision> &x)<br> |
---|
503 | </span> |
---|
504 | Ýòà ôóíêöèÿ âîçâðàùàåò íàòóðàëüíûé ëîãàðèôì <code>x</code>. |
---|
505 | </p> |
---|
506 | |
---|
507 | <p> |
---|
508 | <span class=func> |
---|
509 | <b>template</b><<b>unsigned</b> <b>int</b> Precision><br> |
---|
510 | <b>const</b> ampf<Precision> log2(<b>const</b> ampf<Precision> &x)<br> |
---|
511 | </span> |
---|
512 | Ýòà ôóíêöèÿ âîçâðàùàåò äâîè÷íûé ëîãàðèôì <code>x</code>. |
---|
513 | </p> |
---|
514 | |
---|
515 | <p> |
---|
516 | <span class=func> |
---|
517 | <b>template</b><<b>unsigned</b> <b>int</b> Precision><br> |
---|
518 | <b>const</b> ampf<Precision> log10(<b>const</b> ampf<Precision> &x)<br> |
---|
519 | </span> |
---|
520 | Ýòà ôóíêöèÿ âîçâðàùàåò äåñÿòè÷íûé ëîãàðèôì <code>x</code>. |
---|
521 | </p> |
---|
522 | |
---|
523 | <p> |
---|
524 | <span class=func> |
---|
525 | <b>template</b><<b>unsigned</b> <b>int</b> Precision><br> |
---|
526 | <b>const</b> ampf<Precision> exp(<b>const</b> ampf<Precision> &_x)<br> |
---|
527 | </span> |
---|
528 | Ýòà ôóíêöèÿ âîçâðàùàåò <code>å</code> â ñòåïåíè <code>x</code>. |
---|
529 | </p> |
---|
530 | |
---|
531 | <p> |
---|
532 | <span class=func> |
---|
533 | <b>template</b><<b>unsigned</b> <b>int</b> Precision><br> |
---|
534 | <b>const</b> ampf<Precision> sinh(<b>const</b> ampf<Precision> &x)<br> |
---|
535 | </span> |
---|
536 | Ýòà ôóíêöèÿ âîçâðàùàåò ãèïåðáîëè÷åñêèé ñèíóñ <code>x</code>. |
---|
537 | </p> |
---|
538 | |
---|
539 | <p> |
---|
540 | <span class=func> |
---|
541 | <b>template</b><<b>unsigned</b> <b>int</b> Precision><br> |
---|
542 | <b>const</b> ampf<Precision> cosh(<b>const</b> ampf<Precision> &_x)<br> |
---|
543 | </span> |
---|
544 | Ýòà ôóíêöèÿ âîçâðàùàåò ãèïåðáîëè÷åñêèé êîñèíóñ <code>x</code>. |
---|
545 | </p> |
---|
546 | |
---|
547 | <p> |
---|
548 | <span class=func> |
---|
549 | <b>template</b><<b>unsigned</b> <b>int</b> Precision><br> |
---|
550 | <b>const</b> ampf<Precision> tanh(<b>const</b> ampf<Precision> &_x)<br> |
---|
551 | </span> |
---|
552 | Ýòà ôóíêöèÿ âîçâðàùàåò ãèïåðáîëè÷åñêèé òàíãåíñ <code>x</code>. |
---|
553 | </p> |
---|
554 | |
---|
555 | <p> |
---|
556 | <span class=func> |
---|
557 | <b>template</b><<b>unsigned</b> <b>int</b> Precision><br> |
---|
558 | <b>const</b> ampf<Precision> pow(<b>const</b> ampf<Precision> &x, <b>const</b> ampf<Precision> &y)<br> |
---|
559 | </span> |
---|
560 | Ýòà ôóíêöèÿ âîçâðàùàåò <code>x</code> â ñòåïåíè <code>y</code>. |
---|
561 | </p> |
---|
562 | |
---|
563 | <h1>Âåêòîðû, ìàòðèöû è áàçîâûå îïåðàöèè ëèíåéíîé àëãåáðû</h1> |
---|
564 | |
---|
565 | <h2>Ââåäåíèå</h2> |
---|
566 | |
---|
567 | <p> |
---|
568 | Áèáëèîòåêà AP, âõîäÿùàÿ â ñîñòàâ ïðîåêòà ALGLIB, âêëþ÷àåò â ñåáÿ êëàññû-øàáëîíû âåêòîðîâ è ìàòðèö, à òàêæå ïîäïðîãðàììû äëÿ îñóùåñòâëåíèÿ íàä íèìè áàçîâûõ îïåðàöèé ëèíåéíîé àëãåáðû (àíàëîã Level 1 BLAS). Ïîñêîëüêó áèáëèîòåêà AP ðåàëèçóåò êëàññû ìàòðèö, èñïîëüçóÿ øàáëîíû, ýòè æå êëàññû ìîæíî èñïîëüçîâàòü äëÿ ðàáîòû ñ ìàòðèöàìè, ñîñòîÿùèìè èç ÷èñåë âûñîêîé òî÷íîñòè. Ïî ýòîé ïðè÷èíå áèáëèîòåêà AMP íå ñîäåðæèò êëàññîâ ìàòðèö è âåêòîðîâ. |
---|
569 | Áàçîâûå îïåðàöèè ëèíåéíîé àëãåáðû â áèáëèîòåêå AP òàêæå ðåàëèçîâàíû ñ èñïîëüçîâàíèåì øàáëîíîâ, íî â ýòîì ñëó÷àå áèáëèîòåêà AMP ïðåäëàãàåò ñâîé àíàëîã, íàïèñàííûé ñïåöèàëüíî äëÿ îïåðàöèé ñ ÷èñëàìè âûñîêîé òî÷íîñòè. Ïîäïðîãðàììû áèáëèîòåêè AMP ñïåöèàëüíî îïòèìèçèðîâàíû äëÿ ñíèæåíèÿ íàãðóçêè íà ìåíåäæåð ïàìÿòè, ïîýòîìó ïðè îñóùåñòâëåíèè âåêòîðíûõ îïåðàöèé íàä ÷èñëàìè âûñîêîé òî÷íîñòè ñëåäóåò èñïîëüçîâàòü èìåííî èõ. |
---|
570 | </p> |
---|
571 | |
---|
572 | <h2>Îïèñàíèå</h2> |
---|
573 | |
---|
574 | <p> |
---|
575 | <span class=func> |
---|
576 | <b>template</b><<b>unsigned</b> <b>int</b> Precision><br> |
---|
577 | ampf<Precision> vDotProduct(ap::const_raw_vector< ampf<Precision> > v1, ap::const_raw_vector< ampf<Precision> > v2)<br> |
---|
578 | </span> |
---|
579 | Ýòà ôóíêöèÿ âîçâðàùàåò ñêàëÿðíîå ïðîèçâåäåíèå äâóõ âåêòîðîâ. Âåêòîðû çàäàþòñÿ ïðè ïîìîùè ñòðóêòóð <code>ap::const_raw_vector</code> (ýòà ñòðóêòóðà îïðåäåëåíà â ôàéëå <code>ap.h</code>, áîëåå ïîäðîáíî ñì. îïèñàíèå áèáëèîòåêè AP). |
---|
580 | </p> |
---|
581 | |
---|
582 | <p> |
---|
583 | <span class=func> |
---|
584 | <b>template</b><<b>unsigned</b> <b>int</b> Precision><br> |
---|
585 | <b>void</b> vMove(ap::raw_vector< ampf<Precision> > vDst, ap::const_raw_vector< ampf<Precision> > vSrc)<br> |
---|
586 | </span> |
---|
587 | Ýòà ôóíêöèÿ êîïèðóåò âåêòîð <code>vSrc</code> â âåêòîð <code>vDst</code>. |
---|
588 | </p> |
---|
589 | |
---|
590 | <p> |
---|
591 | <span class=func> |
---|
592 | <b>template</b><<b>unsigned</b> <b>int</b> Precision><br> |
---|
593 | <b>void</b> vMoveNeg(ap::raw_vector< ampf<Precision> > vDst, ap::const_raw_vector< ampf<Precision> > vSrc)<br> |
---|
594 | </span> |
---|
595 | Ýòà ôóíêöèÿ êîïèðóåò âåêòîð <code>vSrc</code> â âåêòîð <code>vDst</code>, óìíîæàÿ åãî íà <code>-1</code>. |
---|
596 | </p> |
---|
597 | |
---|
598 | <p> |
---|
599 | <span class=func> |
---|
600 | <b>template</b><<b>unsigned</b> <b>int</b> Precision, <b>class</b> T2><br> |
---|
601 | <b>void</b> vMove(ap::raw_vector< ampf<Precision> > vDst, ap::const_raw_vector< ampf<Precision> > vSrc, T2 alpha)<br> |
---|
602 | </span> |
---|
603 | Ýòà ôóíêöèÿ êîïèðóåò âåêòîð <code>vSrc</code> â âåêòîð <code>vDst</code>, óìíîæàÿ åãî íà êîíñòàíòó <code>alpha</code>. |
---|
604 | </p> |
---|
605 | |
---|
606 | <p> |
---|
607 | <span class=func> |
---|
608 | <b>template</b><<b>unsigned</b> <b>int</b> Precision><br> |
---|
609 | <b>void</b> vAdd(ap::raw_vector< ampf<Precision> > vDst, ap::const_raw_vector< ampf<Precision> > vSrc)<br> |
---|
610 | </span> |
---|
611 | Ýòà ôóíêöèÿ äîáàâëÿåò ê âåêòîðó <code>vDst</code> âåêòîð <code>vScr</code>. |
---|
612 | </p> |
---|
613 | |
---|
614 | <p> |
---|
615 | <span class=func> |
---|
616 | <b>template</b><<b>unsigned</b> <b>int</b> Precision, <b>class</b> T2><br> |
---|
617 | <b>void</b> vAdd(ap::raw_vector< ampf<Precision> > vDst, ap::const_raw_vector< ampf<Precision> > vSrc, T2 alpha)<br> |
---|
618 | </span> |
---|
619 | Ýòà ôóíêöèÿ äîáàâëÿåò ê âåêòîðó <code>vDst</code> âåêòîð <code>vScr</code>, óìíîæåííûé íà êîíñòàíòó <code>alpha</code>. |
---|
620 | </p> |
---|
621 | |
---|
622 | <p> |
---|
623 | <span class=func> |
---|
624 | <b>template</b><<b>unsigned</b> <b>int</b> Precision><br> |
---|
625 | <b>void</b> vSub(ap::raw_vector< ampf<Precision> > vDst, ap::const_raw_vector< ampf<Precision> > vSrc)<br> |
---|
626 | </span> |
---|
627 | Ýòà ôóíêöèÿ âû÷èòàåò èç âåêòîðà <code>vDst</code> âåêòîð <code>vScr</code>. |
---|
628 | </p> |
---|
629 | |
---|
630 | <p> |
---|
631 | <span class=func> |
---|
632 | <b>template</b><<b>unsigned</b> <b>int</b> Precision, <b>class</b> T2><br> |
---|
633 | <b>void</b> vSub(ap::raw_vector< ampf<Precision> > vDst, ap::const_raw_vector< ampf<Precision> > vSrc, T2 alpha)<br> |
---|
634 | </span> |
---|
635 | Ýòà ôóíêöèÿ âû÷èòàåò èç âåêòîðà <code>vDst</code> âåêòîð <code>vScr</code>, óìíîæåííûé íà êîíñòàíòó <code>alpha</code>. |
---|
636 | </p> |
---|
637 | |
---|
638 | <p> |
---|
639 | <span class=func> |
---|
640 | <b>template</b><<b>unsigned</b> <b>int</b> Precision, <b>class</b> T2><br> |
---|
641 | <b>void</b> vMul(ap::raw_vector< ampf<Precision> > vDst, T2 alpha)<br> |
---|
642 | </span> |
---|
643 | Ýòà ôóíêöèÿ óìíîæàåò âåêòîð <code>vDst</code> íà êîíñòàíòó <code>alpha</code>. |
---|
644 | </p> |
---|
645 | |
---|
646 | <h1>Êëàññ amp::campf è îïåðàöèè ñ íèì</h1> |
---|
647 | |
---|
648 | <h2>Îáùèå ïðèíöèïû</h2> |
---|
649 | |
---|
650 | <p> |
---|
651 | Êëàññ <code>amp::campf</code> ðåàëèçóåò îïåðàöèè ñ êîìïëåêñíûìè ÷èñëàìè âûñîêîé òî÷íîñòè. Äåéñòâèòåëüíàÿ è ìíèìàÿ ÷àñòè õðàíÿòñÿ â ïîëÿõ <code>x</code> è <code>y</code>, èìåþùèõ òèï <code>amp::ampf</code>. Ñ îáúåêòàìè ýòîãî òèïà ìîæíî îñóùåñòâëÿòü àðèôìåòè÷åñêèå îïåðàöèè, îïåðàöèè ñðàâíåíèÿ, òàêæå äëÿ ýòîãî òèïà äàííûõ îïðåäåëåíû íåêîòîðûå èç ñòàíäàðòíûõ ìàòåìàòè÷åñêèõ ôóíêöèé. |
---|
652 | </p> |
---|
653 | |
---|
654 | <h2>×ëåíû êëàññà amp::ampf</h2> |
---|
655 | |
---|
656 | <pre> |
---|
657 | <code> |
---|
658 | <b>template</b><<b>unsigned</b> <b>int</b> Precision> |
---|
659 | class campf |
---|
660 | { |
---|
661 | public: |
---|
662 | campf():x(0),y(0); |
---|
663 | campf(<b>long</b> <b>double</b> v); |
---|
664 | campf(<b>double</b> v); |
---|
665 | campf(<b>float</b> v); |
---|
666 | campf(<b>signed</b> <b>long</b> v); |
---|
667 | campf(<b>unsigned</b> <b>long</b> v); |
---|
668 | campf(<b>signed</b> <b>int</b> v); |
---|
669 | campf(<b>unsigned</b> <b>int</b> v); |
---|
670 | campf(<b>signed</b> <b>short</b> v); |
---|
671 | campf(<b>unsigned</b> <b>short</b> v); |
---|
672 | campf(<b>signed</b> <b>char</b> v); |
---|
673 | campf(<b>unsigned</b> <b>char</b> v); |
---|
674 | campf(<b>const</b> ampf<Precision> &_x); |
---|
675 | campf(<b>const</b> ampf<Precision> &_x, <b>const</b> ampf<Precision> &_y); |
---|
676 | campf(<b>const</b> campf &z):x(z.x),y(z.y); |
---|
677 | <b>template</b><<b>unsigned</b> <b>int</b> Prec2> |
---|
678 | campf(<b>const</b> campf<Prec2> &z); |
---|
679 | |
---|
680 | campf& <b>operator</b>= (<b>long double</b> v); |
---|
681 | campf& <b>operator</b>= (<b>double</b> v); |
---|
682 | campf& <b>operator</b>= (<b>float</b> v); |
---|
683 | campf& <b>operator</b>= (<b>signed long</b> v); |
---|
684 | campf& <b>operator</b>= (<b>unsigned long</b> v); |
---|
685 | campf& <b>operator</b>= (<b>signed int</b> v); |
---|
686 | campf& <b>operator</b>= (<b>unsigned int</b> v); |
---|
687 | campf& <b>operator</b>= (<b>signed short</b> v); |
---|
688 | campf& <b>operator</b>= (<b>unsigned short</b> v); |
---|
689 | campf& <b>operator</b>= (<b>signed char</b> v); |
---|
690 | campf& <b>operator</b>= (<b>unsigned char</b> v); |
---|
691 | campf& <b>operator</b>= (<b>const char</b> *s); |
---|
692 | campf& <b>operator</b>= (<b>const</b> std::string &s); |
---|
693 | campf& <b>operator</b>= (<b>const</b> campf& r); |
---|
694 | <b>template</b><<b>unsigned</b> <b>int</b> Precision2> |
---|
695 | campf& <b>operator</b>= (<b>const</b> campf<Precision2>& r); |
---|
696 | |
---|
697 | ampf<Precision> x, y; |
---|
698 | }; |
---|
699 | </code> |
---|
700 | </pre> |
---|
701 | |
---|
702 | <h2>Àðèôìåòè÷åñêèå îïåðàöèè</h2> |
---|
703 | |
---|
704 | <p> |
---|
705 | Êëàññ <code>amp::campf</code> ïåðåîïðåäåëÿåò îïåðàöèè ñðàâíåíèÿ, ñëîæåíèÿ, âû÷èòàíèÿ, óìíîæåíèÿ è äåëåíèÿ. Îïåðàíäàìè ìîãóò áûòü äâà îáúåêòà <code>amp::campf</code> îäíîé è òîé æå òî÷íîñòè.  âûðàæåíèè äîïóñêàåòñÿ ñìåøèâàòü îáúåêòû òèïà <code>amp::campf</code>, îáúåêòû òèïà <code>amp::ampf</code> è ñòàíäàðòíûå òèïû äàííûõ. Ñìåøèâàòü îáúåêòû òèïà <code>amp::campf</code> ñ ðàçíîé òî÷íîñòüþ ìîæíî, òîëüêî åñëè îäèí èç îïåðàíäîâ ÿâíûì îáðàçîì ïðèâîäèòñÿ ê òèïó äðóãîãî. |
---|
706 | </p> |
---|
707 | |
---|
708 | <h2>Ñòàíäàðòíûå ôóíêöèè</h2> |
---|
709 | |
---|
710 | <p> |
---|
711 | <span class=func> |
---|
712 | <b>template</b><<b>unsigned</b> <b>int</b> Precision><br> |
---|
713 | <b>const</b> ampf<Precision> abscomplex(<b>const</b> campf<Precision> &z)<br> |
---|
714 | </span> |
---|
715 | Ýòà ôóíêöèÿ âîçâðàùàåò ìîäóëü êîìïëåêñíîãî ÷èñëà. |
---|
716 | </p> |
---|
717 | |
---|
718 | <p> |
---|
719 | <span class=func> |
---|
720 | <b>template</b><<b>unsigned</b> <b>int</b> Precision><br> |
---|
721 | <b>const</b> campf<Precision> conj(<b>const</b> campf<Precision> &z)<br> |
---|
722 | </span> |
---|
723 | Ýòà ôóíêöèÿ âîçâðàùàåò ÷èñëî, ñîïðÿæåííîå äàííîìó |
---|
724 | </p> |
---|
725 | |
---|
726 | <p> |
---|
727 | <span class=func> |
---|
728 | <b>template</b><<b>unsigned</b> <b>int</b> Precision><br> |
---|
729 | <b>const</b> campf<Precision> csqr(<b>const</b> campf<Precision> &z)<br> |
---|
730 | </span> |
---|
731 | Ýòà ôóíêöèÿ âîçâðàùàåò êâàäðàò ÷èñëà. |
---|
732 | </p> |
---|
733 | |
---|
734 | </body> |
---|
735 | </html> |
---|