Сделаем небольшое отступление и прежде чем вернуться к вопросу плотности, построим мост между физикой и информатикой.

В прошлый раз мы пытались взвесить Петю и Васю, не имея под руками весов, и в какой-то момент, воспользовавшись качелями, сказали:

«[теперь] мы-то знаем, что Вася весит больше, чем Петя, а на сколько или во сколько раз больше?»

Но в итоге мы смогли ответить только на вопрос «во сколько раз Вася весит больше, чем Петя», а не «на сколько».

А почему не «на сколько»?

Деньги и Расстояние на одних весах

Кому интересно официальное определение термина размерность, тот может прочитать его здесь. А мы пока вспомним о нашем алгоритме покупки продуктов.

Помните, мы говорили, что для того, чтобы алгоритм стал более универсальным, нам надо задать входные параметры (переменные), которые будут обозначать «что купить», «где купить» и «какая сумма доступна»?

И уже в конце мы вскользь упомянули о том, что у переменных есть не только имя, но и тип, который определяет допустимый диапазон значений.

Например, в нашем примере сумма может быть только в рублях, её нельзя задать в метрах или в килограммах — то есть у неё был бы тип Деньги.

(Примечание: про «что купить» и «где купить» мы пока говорить не будем — эти переменные, скорее всего, будут подсписками более больших, заранее заданных, списков: продуктов и доступных магазинов и для нашего примера они слишком сложные).

Если бы у нас была ещё одна переменная, например, максимальное расстояние, на которое мы можем удаляться от дома в поисках продуктов, то она бы имела тип Расстояние.

Можно ли сравнивать переменную типа Деньги с переменной типа Расстояние?

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

Петя и Вася на качелях

Так вот, возвращаясь к Пете и Васе. Посмотрим на упрощенную схему их взаимного расположения: на одном краю у нас сидит Петя, а на другом — Вася.

Обозначим расстояние от центра Пети до оси как LпетиL_{\text{пети}} . А расстояние от центра Васи до оси качель — как LвасиL_{\text{васи}} .

Обозначим предполагаемые массы Пети и Васи как mпетиm_{\text{пети}} и mвасиm_{\text{васи}} соответственно.

Что у нас говорит физика? Что во сколько раз Вася тяжелее Пети, то во столько же раз Петя будет сидеть дальше от оси, чем Вася (если мы хотим их уравновесить).

Посмотрите на формулу на рисунке: если вы делите одну LL на другую LL , то вы получаете безразмерную величину в ответе — в нашем случае это 22 — ответ на вопрос: сколько отрезков LвасиL_{\text{васи}} поместится в отрезке LпетиL_{\text{пети}} . 22 — это не 2метра2\,\text{метра} , не 2сантиметра2\,\text{сантиметра} (и уж не 2килограмма2\,\text{килограмма} ). Это просто 22 !

Аналогично, вы делите одну массу на другую и тоже получаете безразмерную величину.

Поэтому мы и можем сопоставить одно соотношение с другим — у них совпадают итоговые размерности, или, если говорить шутя, «безразмерности» 🙂, как это выходит в нашем случае.

Возвращаясь к вопросу, озвученному в начале нашего предыдущего сообщения: «почему мы не можем сказать на сколько [больше весит]?».

А как? У нас есть только LпетиL_{\text{пети}} и LвасиL_{\text{васи}} . Размерность каждого из этих расстояний — LL : dimLпети=dimLваси=L\operatorname{dim} L_{\text{пети}} = \operatorname{dim} L_{\text{васи}} = L . Если мы вычтем одно из другого, размерность результата останется той же.

Обратите внимание, что когда я говорю LL , я имею в виду размерность длины — по аналогии с типом Длина. Если из длины вычесть длину — длина и получится!


На всякий случай давайте этот момент чуть подробнее проговорим — LпетиL_{\text{пети}} — это конкретное значение, например, 2метра2\,\text{метра} . LвасиL_{\text{васи}} — тоже конкретное значение, например, 1метр1\,\text{метр} .

LпетиLваси=2метра1метр=1метр L_{\text{пети}} - L_{\text{васи}} = 2\,\text{метра} - 1\,\text{метр} = 1\,\text{метр}

А если мы говорим про размерность, то эта формула будет выглядеть так:

dim(LпетиLваси)=L \operatorname{dim}(L_{\text{пети}} - L_{\text{васи}}) = L

Потому что неважно, складываете вы длины, вычитаете ли их, у вас все равно остается длина! Вы никогда не получите MM — размерность массы!

Примечание: размерность величины мы будем обозначать через dim\operatorname{dim} , а сами размерности — заглавными буквами: LL — длина, MM — масса.


Можно сказать, что размерности ограничивают нас в возможностях, но на самом деле размерности лишь отражают нашу реальность.

А главное, чем они полезны для нас — с помощью них мы можем проверить, что не ошиблись в своих вычислениях, или в своей программе, если говорить о типах переменных.

Если в каком-либо месте при решении задачи вы вдруг начинаете из килограммов вычитать метры — значит, у вас где-то закралась ошибка!

Если в программе в какой-то момент вы начинаете сравнивать деньги и расстояние, — значит, в программе у вас ошибка!

Так размерности и типы переменных защищают нас от ошибок!

И прежде чем мы перейдем к плотности, вот вам небольшая задачка.

На подумать

Что нужно сделать, чтобы мы все-таки могли сказать какая масса у Васи?

Oтвет

Для этого нужно превратить Петю в эталон! Посмотрите на пропорцию: если умножить обе стороны равенства на mпетиm_{\text{пети}} , то мы получим, что mваси=2mпетиm_{\text{васи}} = 2 \cdot m_{\text{пети}} , а с точки зрения размерности это выглядело бы так:

dimmваси=LLM=M \operatorname{dim} m_{\text{васи}} = \frac{L}{L} \cdot M = M

Если бы мы заранее знали, что Петя весит 30кг30\,\text{кг} , то тогда смогли бы вычислить, что Вася весит 60кг60\,\text{кг} .

Словарь

— размерность: LL — длина, MM — масса, …

— безразмерная величина

— тип переменной