§ Постановка задачи

Однажды у меня возникла задача резко и просто перевести байты в килобайты и гигабайты с петабайтами и я не имел понятия о том, как это сделать быстро, используя лишь одну математику.
Сначала я копал в эту сторону
if (size < 1024)
    return size + " байт";
else if (size < 1024*1024)
    return round(size/1024, 2) + " кб";
else if (size < 1024*1024*1024)
    return round(size/1024/1024, 2) + " мб";

§ Решение

Потом я понял, что это индусское решение и решил переписать с помощью логарифмов. А что такое логарифм? Это обратное к степени действие. Так вот, поскольку числа кратны 1024, то я и решил взять количество по этому основанию:
k = [ \log_{1024}x ]
Причем тут k это целое число. Так вот, если x < 1024 то тогда k будет равно 0, если же x \lt 1024^2 то тогда же k = 1. И так далее.
В итоге я написал так (код на псевдоязыке)
int k = log(x) / log(1024);
int p = pow(1024, k);
float r = round(x / p, 2);
return r + " " + ["байт", "кб", "мб", "гб", "тб", "пб", "эб"][k];
15 мая, 2020
© 2007-2022 Мышка пролетает все права