Добавил:
t.me Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

2 семестр / Литература / Язык программирования С++. Краткий курс. Страуструп

.pdf
Скачиваний:
9
Добавлен:
16.07.2023
Размер:
31.34 Mб
Скачать

14

Числовые

вычисления

Цель

вычислений

-

понимание, а не цифры...

-Р.У. Хэмминг

+ + +

... но для студента цифры часто оказываются

лучшей дорогой к пониманию.

-А. Ральстон

Введение Математические функции

Числовые алгоритмы

+ + + + +

Параллельные алгоритмы

Комплексные числа

Случайные числа

Векторная арифметика Границы числовых значений Советы

14.1.

Введение

С++ не был разработан, в первую очередь, для числовых вычислений. Од­ нако числовые вычисления обычно выполняются в контексте другой деятель­ ности, такой как доступ к базам данных, сетевое взаимодействие, управле­ ние приборами, графика, моделирование и финансовый анализ, поэтому С++

становится

привлекательным

средством

для

вычислений,

являющихся

частью

более

крупной

системы.

Кроме

того,

численные

методы

прошли

долгий

путь

от

простых

циклов

по

векторам

чисел

с

плавающей

точкой.

Там,

где

как часть

вычислений

необходимы

более

сложные

структуры

данных,

становятся

ак­

туальными

сильные

стороны

С++.

В

итоге

сегодня

С++

широко

использует­

ся

для

научных,

инженерных,

финансовых

и

других

вычислений

с

помощью

сложных

численных

методов.

Как

следствие

появились

средства

и

методы,

поддерживающие такие вычисления. В этой

главе описываются части

дартной библиотеки, которые поддерживают

числовые вычисления.

стан­

262

Глава

14.

Числовые

вычисления

14.2.

Математические

функции

В

заголовочном

файле

<cma

th>

находятся

стандартные

.математические

функции,

такие

как

sqrt (),

log

()

или

sin

()

для

аргументов

типов

float,

douЫe

и

long

douЫe.

abs(x) ceil (х) floor (х) sqrt(x) cos(x) sin(x) tan(x) acos(x) asin(x) atan(x) cosh(x) sinh(x) tanh(x) ехр(х) log(x)

loglO(x)

Стандартные математические функции

 

 

Абсолютное значение

 

 

Наименьшее целое, не меньшее х

 

 

Наибольшее целое, не большее х

 

 

Квадратный корень; значение х должно быть неотрицательным

Косинус

 

 

Синус

 

 

Тангенс

 

 

Арккосинус; результат неотрицателен

 

 

Арксинус; возвращается результат, ближайший к нулю

 

Арктангенс

 

 

Гиперболический косинус

 

 

Гиперболический синус

 

 

Гиперболический тангенс

 

 

Экспонента (ев степени х)

 

 

Натуральный логарифм (по основанию е);

значение х

должно быть

положительным

 

 

Десятичный логарифм

 

 

ле

Версии функций

для типа complex (§14.4) находятся в заголовочном фай­

<complex>. Для

каждой функции возвращаемый тип совпадает с типом

аргумента. Об ошибках

сообщается

путем

установки

errno

из

заголовочного

файла

<cerrno>

в

EDOM

для

ошибки

области

определения

и

ERANGE

-

для

ошибки

области

значений.

Например:

void

f

()

{

errno

=

О;

11

sqrt(-1);

 

if (errno==EDOM)

cerr

<<

"sqrt()

errno

=

О;

11

Сброс

старого

состояния

ошибки

не определена

для отрицательного

Сброс

старого

состояния

ошибки

аргумента";

pow(numeric_limits<douЫe>::max(),2);

264

Глава

14.

Числовые

вычисления

list<douЫe> lst (1, 2,

auto s = accumulate(lst

3,

4,

5,

9999.99999);

.begin(),lst.end(),0.0);

//Сумма:

10014.9999

Описанные

алгоритмы

работают

для

любой

последовательности

стандарт­

ной

библиотеки

и

могут

иметь

операции,

предоставляемые

в

качестве

аргу­

ментов(§

14.3).

14.3.1. Параллельные алгоритмы

В заголовочном файле <nurneric> числовые

различающиеся параллельные версии (§ 12.9).

алгоритмы

имеют

немного

Параллельные

числовые

алгоритмы

x=reduce(b,e,v)

x=reduce(b,e) x=reduce(pol,b,e,v)

x=accumulate (Ь, е, v), за исключением порядка вычислений

x=reduce (Ь, е, v{}), где v -тип значения Ь x=reduce (Ь, е, v) со стратегией выполнения pol

x=reduce(pol,b,e)

p=exclusive_scan (pol,b,e,out)

x=reduce (pol, Ь, е, V{}),где V-тип значения Ь

p=partial sum (Ь, е, out)

в соответствии со стратегией

pol, исключая i-й элемент

из i-й суммы

p=inclusive_scan (pol,b,e,out)

p=partial sum (Ь, е, out) со стратегией

и включением i-го элемента в i-ю сумму

выполнения

pol

p=transform_reduce

 

(pol,b,e, f,v)

 

p=transform_exclusive

 

scan(pol,b,e,out,f,v)

 

p=transform_ inclusive

_

scan(pol,b,e,out,f,v)

 

f

(х)

для каждого х из [Ь:е), затем reduce

 

f

(х)

для каждого х из [Ь:е), затем exclusi ve

scan

f

(х)

для каждого х из [Ь:е), затем incl usi ve

_ scan

Для

простоты

я

не

показал

версии

алгоритмов,

которые

принимают

в

ка­

честве

аргумента

функтор,

а

не

просто

используют

+

и

=.

За

исключением

reduce

(),

я

также

не

показал

версии

со

стратегией

выполнения

по

умолча­

нию (последовательное

выполнение) и значением по умолчанию.

Так же, как и для

параллельных алгоритмов в заголовочном

<algori thrn> (§12.9), мы можем определить стратегию выполнения:

файле

vector<douЫe>

v (1,

 

2,

З,

4, 5, 9999.99999);

// Вычисление

суммы

с

использованием

douЫe

в

auto s = reduce(v.begin(),v.end());

 

 

качестве

накопителя:

vector<douЫe> large;

/ /

... Заполнение large

больпмм

количеством

значений

...

[2]

[3]

[4] [5]

[6]

[7]

[8]

[9]

[10]

 

 

 

 

 

14.8. Советы

269

Не пытайтесь работать с серьезными числовыми вычислениями, огра­

ничиваясь

возможностями

"голого" языка -

используйте библиотеки;

§14.1.

 

 

 

 

 

 

Перед

тем

как писать цикл

для вычисления значения из последователь­

ности,

рассмотрите возможность применения

accumula te (), inner_

product (), partial sum ()

и adj acent difference (); §14.3.

 

Используйте std:: complex

для комплексной арифметики; §14.4.

 

Для получения генератора

случайных чисел

свяжите генератор с

рас­

пределением; §14.5.

 

 

 

 

Следите, чтобы ваши случайные числа были

достаточно случайными;

§ 14.5. Не используйте применения этот

rand () из генератор

стандартной недостаточно

библиотеки С; случаен; §14.5.

для

серьезного

Используйте valarray для численных вычислений, когда

эффектив­

ность времени выполнения

важнее гибкости по отношению

к операци­

ям и типам элементов; §14.6.

 

 

Свойства числовых типов

доступны

посредством numeric_limits;

§14.7.

 

 

 

Используйте numeric_limits для

проверки пригодности

числовых

типов для предполагаемого

применения; §14.7.