source: git/Singular/svd/libs/amp.russian.html @ aad4ca4

spielwiese
Last change on this file since aad4ca4 was aad4ca4, checked in by Hans Schoenemann <hannes@…>, 6 years ago
format: Warn -> WarnS, trailing spaces
  • Property mode set to 100644
File size: 35.4 KB
Line 
1<html>
2<head>
3<title>Áèáëèîòåêà àðèôìåòèêè âûñîêîé òî÷íîñòè AMP</title>
4<style type="text/css">
5<!--
6h1 { font-family: Tahoma,sans-serif; font-size : larger; }
7h2 { font-family: Arial,sans-serif; font-size : 11pt; }
8h3 { font-family: Arial,sans-serif; font-size : 9pt; }
9p { text-align: justify; }
10code { 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&lt;128&gt;</code> è <code>amp::ampf&lt;144&gt;</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>&lt;<b>unsigned</b> <b>int</b> Precision&gt;
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 &amp;s);
143        ampf (<b>const char</b> *s);
144
145        ampf(<b>const</b> ampf&amp; r);
146        <b>template</b>&lt;<b>unsigned int</b> Precision2&gt;
147        ampf(<b>const</b> ampf&lt;Precision2&gt;&amp; r);
148
149        ampf&amp; <b>operator</b>= (<b>long double</b> v);
150        ampf&amp; <b>operator</b>= (<b>double</b> v);
151        ampf&amp; <b>operator</b>= (<b>float</b> v);
152        ampf&amp; <b>operator</b>= (<b>signed long</b> v);
153        ampf&amp; <b>operator</b>= (<b>unsigned long</b> v);
154        ampf&amp; <b>operator</b>= (<b>signed int</b> v);
155        ampf&amp; <b>operator</b>= (<b>unsigned int</b> v);
156        ampf&amp; <b>operator</b>= (<b>signed short</b> v);
157        ampf&amp; <b>operator</b>= (<b>unsigned short</b> v);
158        ampf&amp; <b>operator</b>= (<b>signed char</b> v);
159        ampf&amp; <b>operator</b>= (<b>unsigned char</b> v);
160        ampf&amp; <b>operator</b>= (<b>const char</b> *s);
161        ampf&amp; <b>operator</b>= (<b>const</b> std::string &amp;s);
162        ampf&amp; <b>operator</b>= (<b>const</b> ampf&amp; r);
163        <b>template</b>&lt;<b>unsigned int</b> Precision2&gt;
164        ampf&amp; <b>operator</b>= (<b>const</b> ampf&lt;Precision2&gt;&amp; r);
165
166        <b>template</b>&lt;<b>class</b> T&gt;
167        ampf&amp; <b>operator</b>+=(<b>const</b> T&amp; v);
168        <b>template</b>&lt;<b>class</b> T&gt;
169        ampf&amp; <b>operator-</b>=(<b>const</b> T&amp; v);
170        <b>template</b>&lt;class T&gt;
171        ampf&amp; <b>operator</b>*=(<b>const</b> T&amp; v);
172        <b>template</b>&lt;class T&gt;
173        ampf&amp; <b>operator</b>/=(<b>const</b> T&amp; 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 &amp;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&lt;128&gt; 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&lt;128&gt; 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&lt;Precision&gt;::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&lt;128&gt; a(3), b(4), c(99);
293    amp::ampf&lt;256&gt; 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&lt;128&gt;(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>&lt;<b>unsigned int</b> Precision&gt;<br>
317<b>const</b> ampf&lt;Precision&gt; sqr(<b>const</b> ampf&lt;Precision&gt; &amp;x)<br>
318</span>
319Ýòà ôóíêöèÿ ñëóæèò äëÿ âîçâåäåíèÿ ÷èñëà â êâàäðàò.
320</p>
321
322<p>
323<span class=func>
324<b>template</b>&lt;<b>unsigned</b> <b>int</b> Precision&gt;<br>
325<b>const</b> <b>int</b> sign(<b>const</b> ampf&lt;Precision&gt; &amp;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>&lt;<b>unsigned</b> <b>int</b> Precision&gt;<br>
333<b>const</b> ampf&lt;Precision&gt; abs(<b>const</b> ampf&lt;Precision&gt; &amp;x)<br>
334</span>
335Ýòà ôóíêöèÿ âîçâðàùàåò ìîäóëü ÷èñëà.
336</p>
337
338
339<p>
340<span class=func>
341<b>template</b>&lt;<b>unsigned</b> <b>int</b> Precision&gt;<br>
342<b>const</b> ampf&lt;Precision&gt; maximum(<b>const</b> ampf&lt;Precision&gt; &amp;x, <b>const</b> ampf&lt;Precision&gt; &amp;y)<br>
343</span>
344Ýòà ôóíêöèÿ âîçâðàùàåò áîëüøåå èç äâóõ ÷èñåë.
345</p>
346
347<p>
348<span class=func>
349<b>template</b>&lt;<b>unsigned</b> <b>int</b> Precision&gt;<br>
350<b>const</b> ampf&lt;Precision&gt; minimum(<b>const</b> ampf&lt;Precision&gt; &amp;x, <b>const</b> ampf&lt;Precision&gt; &amp;y)<br>
351</span>
352Ýòà ôóíêöèÿ âîçâðàùàåò ìåíüøåå èç äâóõ ÷èñåë.
353</p>
354
355<p>
356<span class=func>
357<b>template</b>&lt;<b>unsigned</b> <b>int</b> Precision&gt;<br>
358<b>const</b> ampf&lt;Precision&gt; sqrt(<b>const</b> ampf&lt;Precision&gt; &amp;x)<br>
359</span>
360Ýòà ôóíêöèÿ âîçâðàùàåò êâàäðàòíûé êîðåíü.
361</p>
362
363<p>
364<span class=func>
365<b>template</b>&lt;<b>unsigned</b> <b>int</b> Precision&gt;<br>
366<b>const</b> <b>signed</b> <b>long</b> trunc(<b>const</b> ampf&lt;Precision&gt; &amp;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>&lt;<b>unsigned</b> <b>int</b> Precision&gt;<br>
374<b>const</b> ampf&lt;Precision&gt; frac(<b>const</b> ampf&lt;Precision&gt; &amp;x)<br>
375</span>
376Ýòà ôóíêöèÿ âîçâðàùàåò äðîáíóþ ÷àñòü ÷èñëà. Äðîáíàÿ ÷àñòü îïðåäåëÿåòñÿ, êàê <code>x-trunc(x)</code>.
377</p>
378
379<p>
380<span class=func>
381<b>template</b>&lt;<b>unsigned</b> <b>int</b> Precision&gt;<br>
382<b>const</b> <b>signed</b> <b>long</b> floor(<b>const</b> ampf&lt;Precision&gt; &amp;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>&lt;<b>unsigned</b> <b>int</b> Precision&gt;<br>
390<b>const</b> <b>signed</b> <b>long</b> ceil(<b>const</b> ampf&lt;Precision&gt; &amp;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>&lt;<b>unsigned</b> <b>int</b> Precision&gt;<br>
398<b>const</b> <b>signed</b> <b>long</b> round(<b>const</b> ampf&lt;Precision&gt; &amp;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>&lt;<b>unsigned</b> <b>int</b> Precision&gt;<br>
406<b>const</b> ampf&lt;Precision&gt; frexp2(<b>const</b> ampf&lt;Precision&gt; &amp;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>&lt;<b>unsigned</b> <b>int</b> Precision&gt;<br>
414<b>const</b> ampf&lt;Precision&gt; ldexp2(<b>const</b> ampf&lt;Precision&gt; &amp;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>&lt;<b>unsigned</b> <b>int</b> Precision&gt;<br>
422<b>const</b> ampf&lt;Precision&gt; pi()<br>
423</span>
424Ýòà ôóíêöèÿ âîçâðàùàåò êîíñòàíòó <code>Pi</code>.
425</p>
426
427<p>
428<span class=func>
429<b>template</b>&lt;<b>unsigned</b> <b>int</b> Precision&gt;<br>
430<b>const</b> ampf&lt;Precision&gt; halfpi()<br>
431</span>
432Ýòà ôóíêöèÿ âîçâðàùàåò ïîëîâèíó êîíñòàíòû <code>Pi</code>.
433</p>
434
435<p>
436<span class=func>
437<b>template</b>&lt;<b>unsigned</b> <b>int</b> Precision&gt;<br>
438<b>const</b> ampf&lt;Precision&gt; twopi()<br>
439</span>
440Ýòà ôóíêöèÿ âîçâðàùàåò óäâîåííóþ êîíñòàíòó <code>Pi</code>.
441</p>
442
443<p>
444<span class=func>
445<b>template</b>&lt;<b>unsigned</b> <b>int</b> Precision&gt;<br>
446<b>const</b> ampf&lt;Precision&gt; sin(<b>const</b> ampf&lt;Precision&gt; &amp;x)<br>
447</span>
448Ýòà ôóíêöèÿ âîçâðàùàåò ñèíóñ àðãóìåíòà.
449</p>
450
451<p>
452<span class=func>
453<b>template</b>&lt;<b>unsigned</b> <b>int</b> Precision&gt;<br>
454<b>const</b> ampf&lt;Precision&gt; cos(<b>const</b> ampf&lt;Precision&gt; &amp;x)<br>
455</span>
456Ýòà ôóíêöèÿ âîçâðàùàåò êîñèíóñ àðãóìåíòà.
457</p>
458
459<p>
460<span class=func>
461<b>template</b>&lt;<b>unsigned</b> <b>int</b> Precision&gt;<br>
462<b>const</b> ampf&lt;Precision&gt; tan(<b>const</b> ampf&lt;Precision&gt; &amp;x)<br>
463</span>
464Ýòà ôóíêöèÿ âîçâðàùàåò òàíãåíñ àðãóìåíòà.
465</p>
466
467<p>
468<span class=func>
469<b>template</b>&lt;<b>unsigned</b> <b>int</b> Precision&gt;<br>
470<b>const</b> ampf&lt;Precision&gt; asin(<b>const</b> ampf&lt;Precision&gt; &amp;x)<br>
471</span>
472Ýòà ôóíêöèÿ âîçâðàùàåò àðêñèíóñ àðãóìåíòà.
473</p>
474
475<p>
476<span class=func>
477<b>template</b>&lt;<b>unsigned</b> <b>int</b> Precision&gt;<br>
478<b>const</b> ampf&lt;Precision&gt; acos(<b>const</b> ampf&lt;Precision&gt; &amp;x)<br>
479</span>
480Ýòà ôóíêöèÿ âîçâðàùàåò àðêêîñèíóñ àðãóìåíòà.
481</p>
482
483<p>
484<span class=func>
485<b>template</b>&lt;<b>unsigned</b> <b>int</b> Precision&gt;<br>
486<b>const</b> ampf&lt;Precision&gt; atan(<b>const</b> ampf&lt;Precision&gt; &amp;x)<br>
487</span>
488Ýòà ôóíêöèÿ âîçâðàùàåò àðêòàíãåíñ àðãóìåíòà.
489</p>
490
491<p>
492<span class=func>
493<b>template</b>&lt;<b>unsigned</b> <b>int</b> Precision&gt;<br>
494<b>const</b> ampf&lt;Precision&gt; atan2(<b>const</b> ampf&lt;Precision&gt; &amp;y, <b>con</b>st ampf&lt;Precision&gt; &amp;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>&lt;<b>unsigned</b> <b>int</b> Precision&gt;<br>
502<b>const</b> ampf&lt;Precision&gt; log(<b>const</b> ampf&lt;Precision&gt; &amp;x)<br>
503</span>
504Ýòà ôóíêöèÿ âîçâðàùàåò íàòóðàëüíûé ëîãàðèôì <code>x</code>.
505</p>
506
507<p>
508<span class=func>
509<b>template</b>&lt;<b>unsigned</b> <b>int</b> Precision&gt;<br>
510<b>const</b> ampf&lt;Precision&gt; log2(<b>const</b> ampf&lt;Precision&gt; &amp;x)<br>
511</span>
512Ýòà ôóíêöèÿ âîçâðàùàåò äâîè÷íûé ëîãàðèôì <code>x</code>.
513</p>
514
515<p>
516<span class=func>
517<b>template</b>&lt;<b>unsigned</b> <b>int</b> Precision&gt;<br>
518<b>const</b> ampf&lt;Precision&gt; log10(<b>const</b> ampf&lt;Precision&gt; &amp;x)<br>
519</span>
520Ýòà ôóíêöèÿ âîçâðàùàåò äåñÿòè÷íûé ëîãàðèôì <code>x</code>.
521</p>
522
523<p>
524<span class=func>
525<b>template</b>&lt;<b>unsigned</b> <b>int</b> Precision&gt;<br>
526<b>const</b> ampf&lt;Precision&gt; exp(<b>const</b> ampf&lt;Precision&gt; &amp;_x)<br>
527</span>
528Ýòà ôóíêöèÿ âîçâðàùàåò <code>å</code> â ñòåïåíè <code>x</code>.
529</p>
530
531<p>
532<span class=func>
533<b>template</b>&lt;<b>unsigned</b> <b>int</b> Precision&gt;<br>
534<b>const</b> ampf&lt;Precision&gt; sinh(<b>const</b> ampf&lt;Precision&gt; &amp;x)<br>
535</span>
536Ýòà ôóíêöèÿ âîçâðàùàåò ãèïåðáîëè÷åñêèé ñèíóñ <code>x</code>.
537</p>
538
539<p>
540<span class=func>
541<b>template</b>&lt;<b>unsigned</b> <b>int</b> Precision&gt;<br>
542<b>const</b> ampf&lt;Precision&gt; cosh(<b>const</b> ampf&lt;Precision&gt; &amp;_x)<br>
543</span>
544Ýòà ôóíêöèÿ âîçâðàùàåò ãèïåðáîëè÷åñêèé êîñèíóñ <code>x</code>.
545</p>
546
547<p>
548<span class=func>
549<b>template</b>&lt;<b>unsigned</b> <b>int</b> Precision&gt;<br>
550<b>const</b> ampf&lt;Precision&gt; tanh(<b>const</b> ampf&lt;Precision&gt; &amp;_x)<br>
551</span>
552Ýòà ôóíêöèÿ âîçâðàùàåò ãèïåðáîëè÷åñêèé òàíãåíñ <code>x</code>.
553</p>
554
555<p>
556<span class=func>
557<b>template</b>&lt;<b>unsigned</b> <b>int</b> Precision&gt;<br>
558<b>const</b> ampf&lt;Precision&gt; pow(<b>const</b> ampf&lt;Precision&gt; &amp;x, <b>const</b> ampf&lt;Precision&gt; &amp;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>&lt;<b>unsigned</b> <b>int</b> Precision&gt;<br>
577ampf&lt;Precision&gt; vDotProduct(ap::const_raw_vector&lt; ampf&lt;Precision&gt; &gt; v1, ap::const_raw_vector&lt; ampf&lt;Precision&gt; &gt; 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>&lt;<b>unsigned</b> <b>int</b> Precision&gt;<br>
585<b>void</b> vMove(ap::raw_vector&lt; ampf&lt;Precision&gt; &gt; vDst, ap::const_raw_vector&lt; ampf&lt;Precision&gt; &gt; vSrc)<br>
586</span>
587Ýòà ôóíêöèÿ êîïèðóåò âåêòîð <code>vSrc</code> â âåêòîð <code>vDst</code>.
588</p>
589
590<p>
591<span class=func>
592<b>template</b>&lt;<b>unsigned</b> <b>int</b> Precision&gt;<br>
593<b>void</b> vMoveNeg(ap::raw_vector&lt; ampf&lt;Precision&gt; &gt; vDst, ap::const_raw_vector&lt; ampf&lt;Precision&gt; &gt; 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>&lt;<b>unsigned</b> <b>int</b> Precision, <b>class</b> T2&gt;<br>
601<b>void</b> vMove(ap::raw_vector&lt; ampf&lt;Precision&gt; &gt; vDst, ap::const_raw_vector&lt; ampf&lt;Precision&gt; &gt; 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>&lt;<b>unsigned</b> <b>int</b> Precision&gt;<br>
609<b>void</b> vAdd(ap::raw_vector&lt; ampf&lt;Precision&gt; &gt; vDst, ap::const_raw_vector&lt; ampf&lt;Precision&gt; &gt; vSrc)<br>
610</span>
611Ýòà ôóíêöèÿ äîáàâëÿåò ê âåêòîðó <code>vDst</code> âåêòîð <code>vScr</code>.
612</p>
613
614<p>
615<span class=func>
616<b>template</b>&lt;<b>unsigned</b> <b>int</b> Precision, <b>class</b> T2&gt;<br>
617<b>void</b> vAdd(ap::raw_vector&lt; ampf&lt;Precision&gt; &gt; vDst, ap::const_raw_vector&lt; ampf&lt;Precision&gt; &gt; 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>&lt;<b>unsigned</b> <b>int</b> Precision&gt;<br>
625<b>void</b> vSub(ap::raw_vector&lt; ampf&lt;Precision&gt; &gt; vDst, ap::const_raw_vector&lt; ampf&lt;Precision&gt; &gt; vSrc)<br>
626</span>
627Ýòà ôóíêöèÿ âû÷èòàåò èç âåêòîðà <code>vDst</code> âåêòîð <code>vScr</code>.
628</p>
629
630<p>
631<span class=func>
632<b>template</b>&lt;<b>unsigned</b> <b>int</b> Precision, <b>class</b> T2&gt;<br>
633<b>void</b> vSub(ap::raw_vector&lt; ampf&lt;Precision&gt; &gt; vDst, ap::const_raw_vector&lt; ampf&lt;Precision&gt; &gt; 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>&lt;<b>unsigned</b> <b>int</b> Precision, <b>class</b> T2&gt;<br>
641<b>void</b> vMul(ap::raw_vector&lt; ampf&lt;Precision&gt; &gt; 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>&lt;<b>unsigned</b> <b>int</b> Precision&gt;
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&lt;Precision&gt; &amp;_x);
675        campf(<b>const</b> ampf&lt;Precision&gt; &amp;_x, <b>const</b> ampf&lt;Precision&gt; &amp;_y);
676        campf(<b>const</b> campf &amp;z):x(z.x),y(z.y);
677        <b>template</b>&lt;<b>unsigned</b> <b>int</b> Prec2&gt;
678        campf(<b>const</b> campf&lt;Prec2&gt; &amp;z);
679
680        campf&amp; <b>operator</b>= (<b>long double</b> v);
681        campf&amp; <b>operator</b>= (<b>double</b> v);
682        campf&amp; <b>operator</b>= (<b>float</b> v);
683        campf&amp; <b>operator</b>= (<b>signed long</b> v);
684        campf&amp; <b>operator</b>= (<b>unsigned long</b> v);
685        campf&amp; <b>operator</b>= (<b>signed int</b> v);
686        campf&amp; <b>operator</b>= (<b>unsigned int</b> v);
687        campf&amp; <b>operator</b>= (<b>signed short</b> v);
688        campf&amp; <b>operator</b>= (<b>unsigned short</b> v);
689        campf&amp; <b>operator</b>= (<b>signed char</b> v);
690        campf&amp; <b>operator</b>= (<b>unsigned char</b> v);
691        campf&amp; <b>operator</b>= (<b>const char</b> *s);
692        campf&amp; <b>operator</b>= (<b>const</b> std::string &amp;s);
693        campf&amp; <b>operator</b>= (<b>const</b> campf&amp; r);
694        <b>template</b>&lt;<b>unsigned</b> <b>int</b> Precision2&gt;
695        campf&amp; <b>operator</b>= (<b>const</b> campf&lt;Precision2&gt;&amp; r);
696
697        ampf&lt;Precision&gt; 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>&lt;<b>unsigned</b> <b>int</b> Precision&gt;<br>
713<b>const</b> ampf&lt;Precision&gt; abscomplex(<b>const</b> campf&lt;Precision&gt; &amp;z)<br>
714</span>
715Ýòà ôóíêöèÿ âîçâðàùàåò ìîäóëü êîìïëåêñíîãî ÷èñëà.
716</p>
717
718<p>
719<span class=func>
720<b>template</b>&lt;<b>unsigned</b> <b>int</b> Precision&gt;<br>
721<b>const</b> campf&lt;Precision&gt; conj(<b>const</b> campf&lt;Precision&gt; &amp;z)<br>
722</span>
723Ýòà ôóíêöèÿ âîçâðàùàåò ÷èñëî, ñîïðÿæåííîå äàííîìó
724</p>
725
726<p>
727<span class=func>
728<b>template</b>&lt;<b>unsigned</b> <b>int</b> Precision&gt;<br>
729<b>const</b> campf&lt;Precision&gt; csqr(<b>const</b> campf&lt;Precision&gt; &amp;z)<br>
730</span>
731Ýòà ôóíêöèÿ âîçâðàùàåò êâàäðàò ÷èñëà.
732</p>
733
734</body>
735</html>
Note: See TracBrowser for help on using the repository browser.