Skip to content

Latest commit

 

History

History
75 lines (55 loc) · 7.42 KB

File metadata and controls

75 lines (55 loc) · 7.42 KB

Математическая памятка для C++

При изучении языка программирования C++ бывают нужны некоторые знания из математики. Ничего особо сложного не требуется. Я буду записывать в этот файл некоторые вещи из этой области.

Традиции при записи чисел в разных странах

В данный момент меня интересуют только англоязычная и русскоязычная традиции. При чтении англоязычной литературы следует учитывать следующее:

  • в англоязычной традиции в дробных числах дробная часть отделяется от целой части точкой («point» или «dot»), а в русскоязычной традиции — запятой. Поэтому, например, фраза «floating point number» переводится на русский как «число с плавающей запятой». Пример написания чисел:

    3.14159  // англоязычная традиция
    3,14129  // русскоязычная традиция
    
  • в англоязычной традиции при записи больших чисел принято для удобства разделять тройки цифр запятыми. В русскоязычной традиции, как можно понять из сказанного выше, запятую для этого неудобно использовать, так как будет путаница с запятой, отделяющей дробную часть от целой части в дробных числах. Поэтому в русскоязычной традиции для разделения троек цифр в больших числах используют разные способы, но не запятую (например, часто используют пробел). Мне нравится использовать для этого символ апострофа ', но я не уверен, что этот способ одобрят бюрократы от русского языка.

    Символ апострофа удобен при публикации текстов с длинными числами в интернете: пробелы браузер может растягивать при выравнивании строки по ширине, при этом удобочитаемость чисел нарушается (также браузер может разнести части числа, разделенные пробелами, на разные строки, что тоже нарушает читаемость текста). Чтобы этого избежать, нужно либо использовать символ неразрывного пробела (но его непросто набрать с клавиатуры), либо можно использовать символ апострофа вместо пробела. Примеры:

    2,145,253.65  // англоязычная традиция
    2 145 253,65  // русскоязычная традиция
    2'145'253,65  // использование апострофов вместо пробелов
    

Целочисленное деление с остатком

Для целочисленного деления в C++ верно следующее:

a = b · q + r       // формула
0 ≤ sgn(a)·r < |b|  // ограничение формулы для обеспечения уникальности результата

Здесь a — это делимое, b — делитель, q — частное и r — остаток. Математическая функция sgn(x) — это функция знака (сигнум). Не путать с евклидовым делением, результаты деления там отличаются в некоторых случаях (в моем блоге про это есть отдельный пост)!

Начиная с версии стандарта C++11, знак остатка совпадает со знаком делимого (до этого в C++ определение знака оставлялось на волю конкретной реализации языка). Тут про это подробнее.

В действующем стандарте C++ вышеприведенная формула изображается в следующем виде (пункт 7.6.5 в черновике стандарта):

(a/b)*b + a%b is equal to a

или (см. статью в справочнике)

(a / b) * b + a % b == a

Изучение чисел с плавающей запятой

Веб-сервисы для изучения чисел с плавающей запятой:

Названия больших чисел

Возьмем для примера диапазон значений 64-битных целых без знака:

[0, 18'446'744'073'709'551'615]

 18 — квинтиллионы
446 — квадриллионы
744 — триллионы
073 — миллиарды
709 — миллионы
551 — тысячи
615 — сотни, десятки, единицы

Большое число, являющееся границей этого диапазона справа, вычисляется по формуле 2^64 - 1. Следует иметь в виду, что существует несколько разных шкал (википедия) с разными названиями больших чисел. Я использовал здесь шкалу, которая называется «короткая шкала с миллиардом вместо биллиона», так как она используется в России.

Полезные ссылки

  • math.stackexchange.com — для вопросов по математике (на английском языке).