Читаем Программирование. Принципы и практика использования C++ Исправленное издание полностью

Долгое время такой код считался совершенно неудовлетворительным, поскольку он просто отбрасывает младшие разряды случайного числа, а они, как правило, не обладают свойствами, которыми должны обладать числа, генерируемые традиционными датчиками случайных чисел. Однако в настоящее время во многих операционных системах эта проблема решена достаточно успешно, но для обеспечения переносимости своих программ мы рекомендуем все же скрывать вычисления случайных чисел в функциях.

int randint(int max) { return rand%max; }

int randint(int min, int max) { return randint(max–min)+min; }

  Таким образом, мы можем скрыть определение функции randint, если окажется, что реализация функции rand является неудовлетворительной. В промышленных программных системах, а также в приложениях, где требуются неравномерные распределения, обычно используются качественные и широко доступные библиотеки случайных чисел, например Boost::random. Для того чтобы получить представление о качестве вашего датчика случайных чисел, выполните упр. 10.

<p id="AutBody_Root477"><strong>24.8. Стандартные математические функции</strong></p>

В стандартной библиотеке есть стандартные математические функции (cos, sin, log и т.д.). Их объявления можно найти в заголовке .

Стандартные математические функции могут иметь аргументы типов float, double, long double и complex (раздел 24.9). Эти функции очень полезны при вычислениях с плавающей точкой. Более подробная информация содержится в широко доступной документации, а для начала можно обратиться к документации, размещенной в веб.

  Если стандартная математическая функция не может дать корректного результата, она устанавливает флажок errno. Рассмотрим пример.

errno = 0;

double s2 = sqrt(–1);

if (errno) cerr << "Что-то где-то пошло не так, как надо";

if (errno == EDOM) // ошибка из-за выхода аргумента

                   // за пределы области определения

  cerr << " фунция sqrt для отрицательных аргументов не определена.";

pow(very_large,2); // плохая идея

if (errno==ERANGE) // ошибка из-за выхода за пределы допустимого

                   // диапазона

  cerr << "pow(" << very_large

       << ",2) слишком большое число для double";

Если вы выполняете серьезные математические вычисления, то всегда должны проверять значение errno, чтобы убедиться, что после возвращения результата оно по-прежнему равно 0. Если нет, то что-то пошло не так, как надо. Для того чтобы узнать, какие математические функции могут устанавливать флажок errno и чему он может быть равен, обратитесь к документации.

  Как показано в примере, ненулевое значение флажка errno просто означает, что что-то пошло не так. Функции, не входящие в стандартную библиотеку, довольно часто также устанавливают флажок errno при выявлении ошибок, поэтому следует точнее анализировать разные значения переменной errno, чтобы понять, что именно случилось. В данном примере до вызова стандартной библиотечной функции переменная errno была равна нулю, а проверка значения errno сразу после выполнения функции может обнаружить, например, константы EDOM и ERANGE. Константа EDOM означает ошибку, возникшую из-за выхода аргумента за пределы области определения функции (domain error). Константа ERANGE означает выход за пределы допустимого диапазона значений (range error).

Обработка ошибок с помощью переменной errno носит довольно примитивный характер. Она уходит корнями в первую версию (выпуска 1975 года) математических функций языка C. 

<p id="AutBody_Root478"><strong>24.9. Комплексные числа</strong></p>

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

template class complex {

  // комплексное число — это пара скалярных величин,

  // по существу, пара координат

  Scalar re, im;

public:

  complex(const Scalar & r, const Scalar & i) :re(r), im(i) { }

  complex(const Scalar & r) :re(r),im(Scalar ) { }

  complex :re(Scalar ), im(Scalar ) { }

  Scalar real { return re; } // действительная часть

Перейти на страницу:

Похожие книги

97 этюдов для архитекторов программных систем
97 этюдов для архитекторов программных систем

Успешная карьера архитектора программного обеспечения требует хорошего владения как технической, так и деловой сторонами вопросов, связанных с проектированием архитектуры. В этой необычной книге ведущие архитекторы ПО со всего света обсуждают важные принципы разработки, выходящие далеко за пределы чисто технических вопросов.?Архитектор ПО выполняет роль посредника между командой разработчиков и бизнес-руководством компании, поэтому чтобы добиться успеха в этой профессии, необходимо не только овладеть различными технологиями, но и обеспечить работу над проектом в соответствии с бизнес-целями. В книге более 50 архитекторов рассказывают о том, что считают самым важным в своей работе, дают советы, как организовать общение с другими участниками проекта, как снизить сложность архитектуры, как оказывать поддержку разработчикам. Они щедро делятся множеством полезных идей и приемов, которые вынесли из своего многолетнего опыта. Авторы надеются, что книга станет источником вдохновения и руководством к действию для многих профессиональных программистов.

Билл де Ора , Майкл Хайгард , Нил Форд

Программирование, программы, базы данных / Базы данных / Программирование / Книги по IT
Программирование. Принципы и практика использования C++ Исправленное издание
Программирование. Принципы и практика использования C++ Исправленное издание

Специальное издание самой читаемой и содержащей наиболее достоверные сведения книги по C++. Книга написана Бьярне Страуструпом — автором языка программирования C++ — и является каноническим изложением возможностей этого языка. Помимо подробного описания собственно языка, на страницах книги вы найдете доказавшие свою эффективность подходы к решению разнообразных задач проектирования и программирования. Многочисленные примеры демонстрируют как хороший стиль программирования на С-совместимом ядре C++, так и современный -ориентированный подход к созданию программных продуктов. Третье издание бестселлера было существенно переработано автором. Результатом этой переработки стала большая доступность книги для новичков. В то же время, текст обогатился сведениями и методиками программирования, которые могут оказаться полезными даже для многоопытных специалистов по C++. Не обойдены вниманием и нововведения языка: стандартная библиотека шаблонов (STL), пространства имен (namespaces), механизм идентификации типов во время выполнения (RTTI), явные приведения типов (cast-операторы) и другие. Настоящее специальное издание отличается от третьего добавлением двух новых приложений (посвященных локализации и безопасной обработке исключений средствами стандартной библиотеки), довольно многочисленными уточнениями в остальном тексте, а также исправлением множества опечаток. Книга адресована программистам, использующим в своей повседневной работе C++. Она также будет полезна преподавателям, студентам и всем, кто хочет ознакомиться с описанием языка «из первых рук».

Бьерн Страуструп , Бьёрн Страуструп , Валерий Федорович Альмухаметов , Ирина Сергеевна Козлова

Программирование, программы, базы данных / Базы данных / Программирование / Учебная и научная литература / Образование и наука / Книги по IT