Допустим для одной цифры в двоичной системе нужна одна цифра в десятеричной.
Для двух и трех двочных цифр все еще нужна одна в десятеричной.
Дальше нужно две, потом три и т.п. Как выглядит эта функция у кого-нибудь есть идея?
Например, я хочу узнать сколько десятичных цифр нужно чтобы поместить х-битное число, без тупого перевода в другое основание.
знаю конкретную задачу: сколько цифр в 2^100. сказать?
Кажи.
вобшем. 2^10 это 1024. можно считать за =10^3, потому что 24 это достаточно мало. (2^10)^10=10^30. 30 нулей и одна единица. и того 31.
вдруг пригодитса. :-[
Максимальное число, состоящее из n бит, равно 2n-1.
Максимальное число, состоящее из m десятичных цифр, равно 10m-1.
Если мы хотим записать n-битное число в десятичной форме, то максимальное двоичное должно умещаться в максимальном десятичном:
2n-1 ≤ 10m-1
2n ≤ 10m
m ≥ log102n
m ≥ n•log102 ≈ n•0,30102999566398119521373889472449
Остается найти наименьшее целое число, соответствующее этому условию.
Интересненько.
Нагуглил вот чё:
Цитата: 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 1 + floor(log10(abs($n)));
}else{
# here logB(x) = log(x)/log(B) will have to do.
return 1 + floor(log(abs($n))/ log($base));
}
}
Т.е. для дестятичного:
m = E(log
10|n|)+1
Интересно почему это отличается от вашего вывода.
Цитата: Python от марта 14, 2011, 13:07
m ≥ n•log102 ≈ n•0,30102999566398119521373889472449
Остается найти наименьшее целое число, соответствующее этому условию.
Если грубо округлить то m = n/3. Выходит у вас функция линейная.
Там же функция логарифмическая, что интуитивно более реально.
А зочем тебе?
В логарифмической функции n — не количество разрядов, а само число.
Цитата: RawonaM от марта 14, 2011, 15:07
Если грубо округлить то m = n/3.
Дык, правильно: 2
3 ≈ 10
1.
3/10 гораздо точнее, сохраняя краткость ^^
210 ≈ 103 - с этим уже можно на производство.
Нельзя. Дробную часть необходимо округлить к верхнему пределу — т.е., прибавить единицу, иначе 1000...1023 вылезет з пределы.
Цитата: basta от марта 14, 2011, 15:31
3/10 гораздо точнее, сохраняя краткость ^^
А кто просил точнее?
Вроде, так:
Если
![k_{2} [tex]k_{2}[/tex]](https://latex.codecogs.com/png.latex?k_{2})
— число знаков в двоичной записи,
![k_{10} [tex]k_{10}[/tex]](https://latex.codecogs.com/png.latex?k_{10})
— число знаков в десятичной записи,
тогда:
Цитата: myst от марта 14, 2011, 15:26
ЦитироватьЕсли грубо округлить то m = n/3.
Дык, правильно: 23 ≈ 101.
Это для восмеричной системы получается. Впрочем, в практических целях это возможно лучший вариант, но в теории неточный.
Ничо нипонил. Ты чего хочешь-то? :what:
Цитата: myst от марта 15, 2011, 09:19
Ничо нипонил. Ты чего хочешь-то? :what:
Точную формулу. 2
3 = 8
1, а не 10.
Цитата: RawonaM от марта 15, 2011, 09:46
Точную формулу.
Тебе же выше её дали.
Цитата: RawonaM от марта 15, 2011, 09:46
23 = 81, а не 10.
Я какбэ в курсе. Хочешь большего приближения, возьми
2
30 и 10
9, например.
9/30 сократимая дробь.
Цитата: RawonaM от марта 15, 2011, 09:46
Точную формулу.
Очевидно, что минимальное натуральное число, которое имеет
![m [tex]m[/tex]](https://latex.codecogs.com/png.latex?m)
-ичную запись из
![k [tex]k[/tex]](https://latex.codecogs.com/png.latex?k)
символов — это
![m^{k-1} [tex]m^{k-1}[/tex]](https://latex.codecogs.com/png.latex?m^{k-1})
, а максимальное —
![m^{k}-1 [tex]m^{k}-1[/tex]](https://latex.codecogs.com/png.latex?m^{k}-1)
.
Следовательно, число символов
![k [tex]k[/tex]](https://latex.codecogs.com/png.latex?k)
для записи числа
![n [tex]n[/tex]](https://latex.codecogs.com/png.latex?n)
в
![m [tex]m[/tex]](https://latex.codecogs.com/png.latex?m)
-ичной системе оценивается так:
![\log_m n\;<\; k \;\leqslant\;1+\log_m n, [tex]\log_m n\;<\; k \;\leqslant\;1+\log_m n,[/tex]](https://latex.codecogs.com/png.latex?\log_m n\;<\; k \;\leqslant\;1+\log_m n,)
то есть,
![k \;=\;1+\left\lfloor\log_m n\right\rfloor. [tex]k \;=\;1+\left\lfloor\log_m n\right\rfloor.[/tex]](https://latex.codecogs.com/png.latex?k \;=\;1+\left\lfloor\log_m n\right\rfloor.)
(Это точное равенство)
Пусть у нас есть две системы счисления:
![m_1 [tex]m_1[/tex]](https://latex.codecogs.com/png.latex?m_1)
и
![m_2 [tex]m_2[/tex]](https://latex.codecogs.com/png.latex?m_2)
, и известно, что в системе
![m_1 [tex]m_1[/tex]](https://latex.codecogs.com/png.latex?m_1)
число
![n [tex]n[/tex]](https://latex.codecogs.com/png.latex?n)
записывается
![k_{m_1} [tex]k_{m_1}[/tex]](https://latex.codecogs.com/png.latex?k_{m_1})
знаками. Найдём число
![k_{m_2} [tex]k_{m_2}[/tex]](https://latex.codecogs.com/png.latex?k_{m_2})
— число знаков в записи
![n [tex]n[/tex]](https://latex.codecogs.com/png.latex?n)
в системе
![m_2 [tex]m_2[/tex]](https://latex.codecogs.com/png.latex?m_2)
:
\qquad k_{m_2} \;=\;1+\left\lfloor\log_{m_2} n\right\rfloor[/tex]](https://latex.codecogs.com/png.latex?(1)\qquad k_{m_2} \;=\;1+\left\lfloor\log_{m_2} n\right\rfloor)
\qquad m_1^{k_{m_1}-1} \;\leqslant\; n \;\leqslant\; m_1^{k_{m_1}}-1[/tex]](https://latex.codecogs.com/png.latex?(2)\qquad m_1^{k_{m_1}-1} \;\leqslant\; n \;\leqslant\; m_1^{k_{m_1}}-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]](https://latex.codecogs.com/png.latex?(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)
Обе оценки достижимы. Нижнюю оценку по-другому можно записать как
![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]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]](https://latex.codecogs.com/png.latex?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)
.
Если надо верхнюю оценку записать в такой форме, её придётся чуть-чуть ухудшить. Она перестанет быть достижимой:
Точная формула — берем количество бит, умножаем на log102 (который можно посчитать в калькуляторе. Можно запомнить приблизительное значение — 0.30103, как правило, этого достаточно), округляем к верхнему пределу (точно не помню, какие закорючки придумали математики для этой операции, в некоторых языках есть функция ceiling; поскольку дробная часть в иррациональном числе будет всегда, можно просто выделить целую часть и прибавить единицу). PROFIT.
Вот-вот, целую страницу формулами зафлудили по чём зря. :)
Спасибо всем за участие :)
Вообще какбе осталось непонятно, интересны людям такие теоретическо-практические вопросы или это только я один такой? :)
Вообще зачем программистам думать? Вот я написал програмистское решение:
a = 1
for i in range(64):
print "%d %d %d %d" % (i+1, len(str(a)), (i+1)/3+1, (i+1)*3/10+1)
a |= (a << 1)
Цитата: output1 1 1 1
2 1 1 1
3 1 2 1
4 2 2 2
5 2 2 2
6 2 3 2
7 3 3 3
8 3 3 3
9 3 4 3
10 4 4 4
11 4 4 4
12 4 5 4
13 4 5 4
14 5 5 5
15 5 6 5
16 5 6 5
17 6 6 6
18 6 7 6
19 6 7 6
20 7 7 7
21 7 8 7
22 7 8 7
23 7 8 7
24 8 9 8
25 8 9 8
26 8 9 8
27 9 10 9
28 9 10 9
29 9 10 9
30 10 11 10
31 10 11 10
32 10 11 10
33 10 12 10
34 11 12 11
35 11 12 11
36 11 13 11
37 12 13 12
38 12 13 12
39 12 14 12
40 13 14 13
41 13 14 13
42 13 15 13
43 13 15 13
44 14 15 14
45 14 16 14
46 14 16 14
47 15 16 15
48 15 17 15
49 15 17 15
50 16 17 16
51 16 18 16
52 16 18 16
53 16 18 16
54 17 19 17
55 17 19 17
56 17 19 17
57 18 20 18
58 18 20 18
59 18 20 18
60 19 21 19
61 19 21 19
62 19 21 19
63 19 22 19
64 20 22 20
В пределах 64 бита формула 3/10+1 точно совпадает.
Теперь вот посетил меня интересный вопрос, как найти минимальное количество цифр не для битов, а для конкретного числа...
Правда правильная формула для восьмеричного должна быть такая: math.ceil((i+1)/3.0), а не то, что я написал.
Цитата: RawonaM от марта 15, 2011, 11:34
Вообще какбе осталось непонятно, интересны людям такие теоретическо-практические вопросы или это только я один такой? :)
Да, я даже статью именно про сабж в одном компьютерном журнале для домохозяек видел.
Продвинутый журнал для дх какой-то :)
Я имел в виду форумчанам какбе.
Цитата: RawonaM от марта 15, 2011, 12:01
Теперь вот посетил меня интересный вопрос, как найти минимальное количество цифр не для битов, а для конкретного числа...
Хм. А это не оно? Отношение количества цифр и основания счисления (http://lingvoforum.net/index.php/topic,32091.msg791750.html#msg791750)
А точно, забыл :)
Кстати вот что пишут тут http://infolingvistica.narod.ru/Origin_of_language.htm#Плотность_информации .
Эта тема на ЛФ уже всплывала, что троичная система самая компактная и самая выгодная.
Здравствуйте!
Например, здесь приводится доказательство для оптимального основания системы счисления: http://www.tver.mesi.ru/e-lib/res/630/6/archsys_6.html, - в третьей главке.
Слово ЭВМ еще используется или статья древняя? :)
В принципе, я нередко слышал "ЭВМ" от самых разных преподавателей в ИТМО, в том числе программистов. Но для "Интуита" могли составить компилятивные статьи, а не именно чьи-нибудь лекции.
Цитата: RawonaM от марта 17, 2011, 21:41
Слово ЭВМ еще используется или статья древняя? :)
По-моему, нет. Старперы разве что.
Цитата: Марбол от марта 17, 2011, 21:35
Например, здесь приводится доказательство для оптимального основания системы счисления: http://www.tver.mesi.ru/e-lib/res/630/6/archsys_6.html, - в третьей главке.
Этот текст поразил меня до глубины души!
Какое же оптимальное? По ссылке не ходил, нельзя.
Троичное десу же, уже сказали. :)
А, так это баян. e же круче.
Цитата: myst от марта 18, 2011, 17:12
А, так это баян. e же круче.
Да, но е не натурал.
Ну и что же? У нас же либерализм на дворе.
Цитата: RawonaM от марта 18, 2011, 17:19
Да, но е не натурал.
Прочитал:
Да, но я не натурал.
Так в статье и написано, что неперово число оптимальное.
Тайльнеймер, а чему Вы так поразились?
Цитата: Марбол от марта 18, 2011, 20:44
Тайльнеймер, а чему Вы так поразились?
Ну, например:
Цитата: http://www.tver.mesi.ru/e-lib/res/630/6/archsys_6.htmlНо для экономической информации характерно то, что очень несложные операции нужно производить всякий раз над большим объемом исходных данных. Так что в данном случае вряд ли целесообразно переходить к новой системе. Это и является объяснением того факта, что в настоящее время значительное число ЭВМ строится именно в десятеричной системе счисления.
Откуда могт взяться десятичные входные данные? Разве что в результате ввода их человеком. Но перевод введённых человеком символов в двоичное число — настолько быстрее самого ввода, что даже говорить не о чем! А тут
«значительное число ЭВМ строится именно в десятеричной системе счисления»!
Или вот:
Цитата: http://www.tver.mesi.ru/e-lib/res/630/6/archsys_6.htmlСпецифика построения схем ЭВМ показывает, что наиболее эффективной является 16-ая система. Именно она и применяется в современных машинах.
Вы что-нибудь слышали об этом? Я в гуглом ничего не нагуглил про шестнадцатиричные ЭВМ. И вообще мне как-то трудно представить это.
:o
Здравствуйте!
Что касается шестнадцатеричной системы счисления, то Ввиикпедии написано об этом так: (wiki/ru) 0x (http://ru.wikipedia.org/wiki/0x), (wiki/ru) IBM/360 (http://ru.wikipedia.org/wiki/IBM/360).
Цитата: Тайльнемер от марта 19, 2011, 07:26
А тут «значительное число ЭВМ строится именно в десятеричной системе счисления»!
Да и это какая-то лажа.
Я вообще слышал только о двоичных и троичных компьютерах. Советы как-то троичный построили. Все остальные в мире были только двоечные вроде.
Цитата: Тайльнемер от марта 19, 2011, 07:26
Откуда могт взяться десятичные входные данные? Разве что в результате ввода их человеком. Но перевод введённых человеком символов в двоичное число — настолько быстрее самого ввода, что даже говорить не о чем!
Почему только ввод человеком? Из файла могут взяться или из каких-нибудь внешних раздражителей.
Цитата: Марбол от марта 19, 2011, 10:03
Что касается шестнадцатеричной системы счисления, то Ввиикпедии написано об этом так: (wiki/ru) 0x, (wiki/ru) IBM/360.
И к чему эта реплика? IBM/360 — двоичная машина, а что там в документации использовали, вообще без разницы.
Цитата: RawonaM от марта 19, 2011, 11:42
Советы как-то троичный построили.
Это было очень давно, но правда. :)
Цитата: RawonaM от марта 19, 2011, 11:42
из каких-нибудь внешних раздражителей.
Десятичные раздражители? И как же они в двоичную машину попадают? :eat:
Например сканирование и распознавание книги с цифрами допустим. Или обработка каких-то десятичных данных. Мало ли.
Цитата: RawonaM от марта 19, 2011, 11:57
Например сканирование и распознавание книги с цифрами допустим.
У тебя результаты сканирования что? А входные и выходные данные распознавателя?
Цитата: RawonaM от марта 19, 2011, 11:57
Или обработка каких-то десятичных данных.
Опять же, что собой представляют твои десятичные данные?
Цитата: myst от марта 19, 2011, 12:00
ЦитироватьНапример сканирование и распознавание книги с цифрами допустим.
У тебя результаты сканирования что? А входные и выходные данные распознавателя?
В чем принципиально отличается единица, которуй человек ввел с клавиатуры и единица, которая распозналась на скане?
Более того. В чем принципиально отличается прямой ввод с клавиатуры от имитации оного? Допустим миллион людей ввели число с клавиатуры и последовательность нажатий клавиш сохранилась. Мне нужно сделать постфактум обработку этих нажатий. Тогда время ввода уже не ограничено человеком.
Цитата: myst от марта 19, 2011, 12:00
ЦитироватьИли обработка каких-то десятичных данных.
Опять же, что собой представляют твои десятичные данные?
Данные, в десятичной системе :)
Цитата: RawonaM от марта 19, 2011, 12:06
Данные, в десятичной системе :)
У тебя есть десятичные накопители данных, десятичные устройства ввода-вывода, десятичная память, десятичные микропроцессоры и пр. и пр.?
Цитата: RawonaM от марта 19, 2011, 12:06
В чем принципиально отличается единица, которуй человек ввел с клавиатуры и единица, которая распозналась на скане?
Более того. В чем принципиально отличается прямой ввод с клавиатуры от имитации оного? Допустим миллион людей ввели число с клавиатуры и последовательность нажатий клавиш сохранилась. Мне нужно сделать постфактум обработку этих нажатий. Тогда время ввода уже не ограничено человеком.
Не понял, о чём ты. Я тебе намекаю, что все устройства двоичные.
Цитата: myst от марта 19, 2011, 12:20
Не понял, о чём ты. Я тебе намекаю, что все устройства двоичные.
Клавиатура тоже двоичная. Человек вводит с нее десятичные цифры.
Цитата: RawonaM от марта 19, 2011, 12:23
Клавиатура тоже двоичная. Человек вводит с нее десятичные цифры
Куда вводит?
См. оригинальную цитату короче :) У меня нет сил какбе на месте пюфона сегодня быть, мне задания нужно доделать :)
Цитата: RawonaM от марта 19, 2011, 12:33
См. оригинальную цитату короче :)
А какая оригинальная-то? :what:
Как ты ни крути, микропроцессорная система и вся периферия оперируют только двоичными числами. И с клавы передаются тоже двоичные числа.
Сия:
Цитата: Тайльнемер от марта 19, 2011, 07:26
Откуда могт взяться десятичные входные данные? Разве что в результате ввода их человеком.
Дык, им вообще неоткуда взяться. :)
Цитата: Марбол от марта 19, 2011, 10:03
Что касается шестнадцатеричной системы счисления, то Ввиикпедии написано об этом так: (wiki/ru) 0x, (wiki/ru) IBM/360.
И что там написано?
Цитата: http://ru.wikipedia.org/wiki/IBM/360Шестнадцатеричная система счисления, широко применявшаяся в документации IBM/360, практически вытеснила ранее доминировавшую восьмеричную.
Цитата: http://ru.wikipedia.org/wiki/0xШироко используется в низкоуровневом программировании и вообще в компьютерной документации
Ясное дело, что в документации её используют как сокращение двоичной. Но не в самих же машинах!
А вот представляет как былоб удобно еслиб мы считали в восьмеричной системе, как древние дравиды. Или еще лучше шестнадцатеричной - древнерусской пудами - вот это былоб вообще здорово для современной технике! Были бы впереди планеты всей.
Впрочем еслиб осталась древняя троичная, то все равно использовали бы троичные машины, потому-что они несколько дороже в изготовлении, но и несколько эффективнее, а если б и человек был бы к ним приспособлен, то без вариантов.
Шозабред? Человека вообще не касается система счисления вычислительных машин.
Цитата: Правильно от марта 19, 2011, 13:32
А вот представляет как былоб удобно еслиб мы считали в восьмеричной системе
Особенно считать на пальцах удобно :)
Цитата: myst от марта 19, 2011, 14:01
Шозабред? Человека вообще не касается система счисления вычислительных машин.
Шозабред? Интерфейс человек-машина, он и в Африке ... Неудобство десятичной системы для программистов это обще известно, если кто забыл из гуманитариев, а так все естественно.
Цитата: Правильно от марта 19, 2011, 14:16
Интерфейс человек-машина, он и в Африке ...
Сколько раз лично вам пришлось складывать/умножать/делить двоичные/шестнадцатеричные/восьмеричные, лазя по этому форуму, например?
Цитата: Правильно от марта 19, 2011, 14:16
Неудобство десятичной системы для программистов это обще известно
Расскажите об этом, мне правда интересно.
Цитата: myst от марта 19, 2011, 15:09
Цитата: Правильно от марта 19, 2011, 14:16
Интерфейс человек-машина, он и в Африке ...
Сколько раз лично вам пришлось складывать/умножать/делить двоичные/шестнадцатеричные/восьмеричные, лазя по этому форуму, например?
Программистам, постоянно, особенно старшего поколения, я это знаю точно так как много знаю и тех и других. Надо знать что это не те что занимаются всякими базами данных, а всякие системные программисты и мат. обеспечения всякого.
Цитата: myst от марта 19, 2011, 15:09
Цитата: Правильно от марта 19, 2011, 14:16
Неудобство десятичной системы для программистов это обще известно
Расскажите об этом, мне правда интересно.
Постоянно приходится сталкиваться с тем что границы целых чисел например в шестнадцатеричной системе счисления очень простое 0xFFFF, а в десятичной надо еще вспомнить. Когда приходится читать\писать на ассемблере, С и тд., там всякие дампы, форматы делать, в общем они постоянно переводят из одной системы счисления в другую. И десятеричная самая не удобная для программистов. Лучшеб степень двойки. Или с тройками (9,12) даже лучше чем десятеричная. Тогда б троичные машины тожеб былиб в ходу.
Цитата: Правильно от марта 19, 2011, 15:38
Программистам, постоянно, особенно старшего поколения, я это знаю точно так как много знаю и тех и других.
А теперь снова прочитайте вопрос, на который отвечали.
Цитата: Правильно от марта 19, 2011, 15:38
Надо знать что это не те что занимаются всякими базами данных, а всякие системные программисты и мат. обеспечения всякого.
И что эти всякие системные программисты и мат. обеспечения всякого программируют?
Цитата: Правильно от марта 19, 2011, 15:38
Постоянно приходится сталкиваться с тем что границы целых чисел например в шестнадцатеричной системе счисления очень простое 0xFFFF, а в десятичной надо еще вспомнить.
Что такое граница целых чисел, и зачем вспоминать, сколько это в десятичной системе?
Цитата: Правильно от марта 19, 2011, 15:38
Когда приходится читать\писать на ассемблере, С и тд., там всякие дампы, форматы делать, в общем они постоянно переводят из одной системы счисления в другую.
OH RLY?! Я буквально вчера смотрел дамп умершей программы, и почему-то ничего не переводил. А ещё я вчера писал код, той же программы, страшно сказать, на С, и тоже не переводил.
Цитата: Правильно от марта 19, 2011, 15:38
И десятеричная самая не удобная для программистов. Лучшеб степень двойки.
А для механиков человеческие руки не самые удобные. Лучше б протезы в виде гаечных ключей и отвёрток.
Цитата: Правильно от марта 19, 2011, 15:38
Тогда б троичные машины тожеб былиб в ходу.
Троичные машины не в ходу, потому что десятичная система неудобна программистам?
Ну вот и результат, я же в этом не смыслю ни шиша. А что значит тогда фраза: "В низкоуровневом программировании и в о о б щ е в компьютерной документации"? Разве программирование какого-либо уровня привходит в область документации?
Цитата: Марбол от марта 20, 2011, 01:06
А что значит тогда фраза: "В низкоуровневом программировании и в о о б щ е в компьютерной документации"?
Странная фраза, да.
Вчера на лекции мимоходом затронули этот вопрос. Все просто.
Дано число n и два базиса a, b. Функция отношения цифр:
Следовательно если нужно конкретное количество цифр, берем максимальное число (т.е. все цифры базис-1) и засовываем в эту формулу.
И еще что-то сказали насчет квантов и основания счисления, кто-нибудь знает какая связь? Т.е. что-то там кванты могут изменить то, что мы пользуемся двоичной системой.