Главное меню
Мы солидарны с Украиной. Узнайте здесь, как можно поддержать Украину.

Отношение количества цифр и основания счисления

Автор RawonaM, марта 14, 2011, 11:18

0 Пользователи и 1 гость просматривают эту тему.

RawonaM

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

Например, я хочу узнать сколько десятичных цифр нужно чтобы поместить х-битное число, без тупого перевода в другое основание.

basta



basta

вобшем. 2^10 это 1024. можно считать за =10^3, потому что 24 это достаточно мало. (2^10)^10=10^30. 30 нулей и одна единица. и того 31.

вдруг пригодитса.  :-[

Python

Максимальное число, состоящее из n бит, равно 2n-1.
Максимальное число, состоящее из m десятичных цифр, равно 10m-1.
Если мы хотим записать n-битное число в десятичной форме, то максимальное двоичное должно умещаться в максимальном десятичном:
2n-1 ≤ 10m-1
2n ≤ 10m
m ≥ log102n
m ≥ n•log102 ≈ n•0,30102999566398119521373889472449
Остается найти наименьшее целое число, соответствующее этому условию.
Пролетареві ніколи вчити європейських мов, бодай би свою знати добре і на ній принести до своєї хати світло знання (Гнат Хоткевич)
ÆC CASALI NAXI PRASQURI: AHOV CÆRU, MERTVÆRI TÆ SLAVUTÆT!
Вони просили його: «Скажи: кетум», а він говорив: «сатем», і не міг вимовити правильно.
Хотелось бы также отметить, что "Питон" - это "мышиный язык" : "пи+тон". © АБР-2

RawonaM

Интересненько.

Нагуглил вот чё:
Цитата: http://php.net/manual/en/function.log.php

#--------------------------------------------------------
#     How many digits does an integer have?
#--------------------------------------------------------

function digit_count($n$base=10) {

  if(
$n == 0) return 1;

  if(
$base == 10) {
    
# using the built-in log10(x)
    # might be more accurate than log(x)/log(10).
    
return floor(log10(abs($n)));
  }else{
    
# here  logB(x) = log(x)/log(B) will have to do.
   
return floor(log(abs($n))/ log($base));
  }
}

Т.е. для дестятичного:
m = E(log10|n|)+1

RawonaM


RawonaM

Цитата: Python от марта 14, 2011, 13:07
m ≥ n•log102 ≈ n•0,30102999566398119521373889472449
Остается найти наименьшее целое число, соответствующее этому условию.
Если грубо округлить то m = n/3. Выходит у вас функция линейная.

Там же функция логарифмическая, что интуитивно более реально.


Python

В логарифмической функции n — не количество разрядов, а само число.
Пролетареві ніколи вчити європейських мов, бодай би свою знати добре і на ній принести до своєї хати світло знання (Гнат Хоткевич)
ÆC CASALI NAXI PRASQURI: AHOV CÆRU, MERTVÆRI TÆ SLAVUTÆT!
Вони просили його: «Скажи: кетум», а він говорив: «сатем», і не міг вимовити правильно.
Хотелось бы также отметить, что "Питон" - это "мышиный язык" : "пи+тон". © АБР-2


basta

3/10 гораздо точнее, сохраняя краткость ^^
210 ≈ 103 - с этим уже можно на производство.

Python

Нельзя. Дробную часть необходимо округлить к верхнему пределу — т.е., прибавить единицу, иначе 1000...1023 вылезет з пределы.
Пролетареві ніколи вчити європейських мов, бодай би свою знати добре і на ній принести до своєї хати світло знання (Гнат Хоткевич)
ÆC CASALI NAXI PRASQURI: AHOV CÆRU, MERTVÆRI TÆ SLAVUTÆT!
Вони просили його: «Скажи: кетум», а він говорив: «сатем», і не міг вимовити правильно.
Хотелось бы также отметить, что "Питон" - это "мышиный язык" : "пи+тон". © АБР-2

myst


Тайльнемер

Вроде, так:

Если
[tex]k_{2}[/tex] — число знаков в двоичной записи,
[tex]k_{10}[/tex] — число знаков в десятичной записи,
тогда:
[tex]<br />1+\left\lfloor (k_2-1) \log_{10}2 \right\rfloor \quad \leqslant \; k_{10} \; < \quad 1+\left\lfloor k_2 \log_{10}2 \right\rfloor<br />[/tex]

RawonaM

Цитата: myst от марта 14, 2011, 15:26
ЦитироватьЕсли грубо округлить то m = n/3.
Дык, правильно: 23 ≈ 101.
Это для восмеричной системы получается. Впрочем, в практических целях это возможно лучший вариант, но в теории неточный.



myst

Цитата: RawonaM от марта 15, 2011, 09:46
Точную формулу.
Тебе же выше её дали.

Цитата: RawonaM от марта 15, 2011, 09:46
23 = 81, а не 10.
Я какбэ в курсе. Хочешь большего приближения, возьми
230 и 109, например.



Тайльнемер

Цитата: RawonaM от марта 15, 2011, 09:46
Точную формулу.
Очевидно, что минимальное натуральное число, которое имеет [tex]m[/tex]-ичную запись из [tex]k[/tex] символов — это [tex]m^{k-1}[/tex], а максимальное — [tex]m^{k}-1[/tex].
Следовательно, число символов [tex]k[/tex] для записи числа [tex]n[/tex] в [tex]m[/tex]-ичной системе оценивается так:
[tex]\log_m n\;<\; k \;\leqslant\;1+\log_m n,[/tex]
то есть,
[tex]k \;=\;1+\left\lfloor\log_m n\right\rfloor.[/tex]
(Это точное равенство)

Пусть у нас есть две системы счисления: [tex]m_1[/tex] и [tex]m_2[/tex], и известно, что в системе [tex]m_1[/tex] число [tex]n[/tex] записывается [tex]k_{m_1}[/tex] знаками. Найдём число [tex]k_{m_2}[/tex] — число знаков в записи [tex]n[/tex]  в системе [tex]m_2[/tex]:
[tex](1)\qquad k_{m_2} \;=\;1+\left\lfloor\log_{m_2} n\right\rfloor[/tex]
[tex](2)\qquad m_1^{k_{m_1}-1} \;\leqslant\; n \;\leqslant\; m_1^{k_{m_1}}-1[/tex]

[tex](1), (2)\quad\Rightarrow \quad 1+\left\lfloor\log_{m_2} (m_1^{k_{m_1}-1})\right\rfloor \;\leqslant\; k_{m_2} \;\leqslant\; 1+\left\lfloor\log_{m_2} (m_1^{k_{m_1}}-1)\right\rfloor[/tex]

Обе оценки достижимы. Нижнюю оценку по-другому можно записать как [tex]1+\left\lfloor (k_{m_1}-1) \log_{m_2} m_1)\right\rfloor \;=\; 1+\left\lfloor (k_{m_1}-1) \frac{\ln m_1}{\ln m_2}\right\rfloor[/tex].

Если надо верхнюю оценку записать в такой форме, её придётся чуть-чуть ухудшить. Она перестанет быть достижимой:
[tex] k_{m_2} \;<\; 1+\left\lfloor k_{m_1} \log_{m_2} m_1)\right\rfloor\;=\; 1+\left\lfloor k_{m_1} \frac{\ln m_1}{\ln m_2}\right\rfloor[/tex]

Python

Точная формула — берем количество бит, умножаем на log102 (который можно посчитать в калькуляторе. Можно запомнить приблизительное значение — 0.30103, как правило, этого достаточно), округляем к верхнему пределу (точно не помню, какие закорючки придумали математики для этой операции, в некоторых языках есть функция ceiling; поскольку дробная часть в иррациональном числе будет всегда, можно просто выделить целую часть и прибавить единицу). PROFIT.
Пролетареві ніколи вчити європейських мов, бодай би свою знати добре і на ній принести до своєї хати світло знання (Гнат Хоткевич)
ÆC CASALI NAXI PRASQURI: AHOV CÆRU, MERTVÆRI TÆ SLAVUTÆT!
Вони просили його: «Скажи: кетум», а він говорив: «сатем», і не міг вимовити правильно.
Хотелось бы также отметить, что "Питон" - это "мышиный язык" : "пи+тон". © АБР-2

myst


RawonaM

Спасибо всем за участие :)
Вообще какбе осталось непонятно, интересны людям такие теоретическо-практические вопросы или это только я один такой? :)

Быстрый ответ

Обратите внимание: данное сообщение не будет отображаться, пока модератор не одобрит его.

Имя:
Имейл:
Проверка:
Оставьте это поле пустым:
Наберите символы, которые изображены на картинке
Прослушать / Запросить другое изображение

Наберите символы, которые изображены на картинке:

√36:
ALT+S — отправить
ALT+P — предварительный просмотр