LINUX.ORG.RU

Конвертирование БОЛЬШОГО числа из dec в hex

 , , ,


0

3

Доброго времени суток.
Требуется поменять основание системы счисления у ОЧЕНЬ большого числа, а именно числа пи.
Оно хранится в файле длиной в несколько гигабайт, в дестиричной системе счисления.
Нужно перегнать в шестнадцатиричную.
Как можно это сделать, наиболее быстрым способом?
Важно ли что это - дробная часть числа или нет?

★★★★★
Ответ на: комментарий от Gvidon

Оно хранится в файле длиной в несколько гигабайт

Ясно же, что не всё.

Deleted
()

Нужно перегнать в шестнадцатиричную.

Зачем? Экономия места? Обратное преобразование тогда тоже потребуется делать.

Важно ли что это - дробная часть числа или нет?

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

m0rph ★★★★★
()

Тебе десятичное целое или дробное надо?
И насколько важен язык?

Deleted
()
Последнее исправление: merhalak (всего исправлений: 1)

Оно хранится в файле длиной в несколько гигабайт, в дестиричной системе счисления

Ничо не понял, оно хранится строкой что ли?

число пи
наиболее быстрым способом?

Нагуглить в нужном тебе виде.

no-such-file ★★★★★
()
Последнее исправление: no-such-file (всего исправлений: 1)

В общем: дробная часть числа - это мнооого геморроя.

Целое число конвертировать в принципе можно.

Deleted
()

А можно поинтересоваться, на кой черт числу пи нужно больше 20 знаков после запятой? Считать с точностью до миллиметра длину большого круга видимой части Вселенной?

anonymous
()
Ответ на: комментарий от Deleted

Прикиньте сколько ему его пересчитывать, если у автора файлик в несколько гигов :)

Не больше 20 часов, если железо такое же.

hateyoufeel ★★★★★
()

Важно ли что это - дробная часть числа или нет?

Там только дробная часть числа пи, без целой части (3)? То есть то, что, собственно, хранится в файле, — целое число?

proud_anon ★★★★★
()
Ответ на: комментарий от Deleted

Вообще у меня есть несколько терабайт, несколько гигов для пробы пера

mersinvald ★★★★★
() автор топика
Ответ на: комментарий от hateyoufeel

При чем тут железо?
Беллард считал алгоритмом Братьев Чудновских, своим алгоритмом только проверял некоторые позиции.

mersinvald ★★★★★
() автор топика
Ответ на: комментарий от pon4ik

pon4ik, m0rph Gvidon merhalak

А как планируется использовать выхлоп?

Бесконечно эффективное сжатие, JFF

И в каком формате хранится сейчас?

Строкой, разбито на несколько крупных файлов, без целой части, перегнать хочу в бинарный вид (1 байт - 2 цифры)

Бесконечную память уже завезли?

При меммапинге меня ограничивает только область адресации, а на дворе уже не 32-битный век.

Зачем? Экономия места? Обратное преобразование тогда тоже потребуется делать.

И экономия места и экономия ресурсов, число нужно именно в 16-ричном представлении (любом кратном ^2)

Тебе десятичное целое или дробное надо?

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

И насколько важен язык?

А алгоритм зависит от языка?

mersinvald ★★★★★
() автор топика
Ответ на: комментарий от mersinvald

перегнать хочу в бинарный вид (1 байт - 2 цифры)

Это ты какую-то фигню хочешь сделать, похоже, а не в бинарный вид перегнать.

Вопрос по поводу языка релевантен: все равно ты свое террабайтное число не загрузишь напрямую на FPU, а поэтому представлять его «по правилам», как ты говоришь, необязательно. У меня возникает подозрение, что раз ты его писал в виде десятичной строки, то значить так тебе его удобно и прочитать.

Хотя «правил» на самом деле никаких нету - бинарное дробное число всего лишь есть целое число сдвинутое N раз вправо. То есть по сути неважно целое или дробное число так представляешь, результат одинаковый.

unlog1c ★★★
()
Ответ на: комментарий от unlog1c

Внесу некоторое прояснение: если бы его писал я, я бы его сразу писал в 16-ричке в нужном формате.

Это ты какую-то фигню хочешь сделать

Зачем мне отводить по байту на цифру, как это сделано сейчас, когда в один байт можно загнать две?

Хотя «правил» на самом деле никаких нету

То есть если я сейчас возьму и переведу его как целое число, в лоб, то получу то же самое, что получил бы, считая сразу в 16-ричной?

mersinvald ★★★★★
() автор топика
Последнее исправление: mersinvald (всего исправлений: 1)
Ответ на: комментарий от mersinvald

Бесконечно эффективное сжатие, JFF

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

mix_mix ★★★★★
()

что за идиотский вопрос

если ЧИСЛО храниться в ФАЙЛЕ то оно записано как 10101010-ДВОИЧНО

и конвертировать из ДВОИЧНОЙ СИСТЕМЫ счисления в шеснатеричную-это дело уже стандартной библиотеки будь то Си или С++

а уж если вы,идиоты,храните ЧИСЛА ТЕКСТОМ

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

anonymous
()
Ответ на: комментарий от mix_mix

Конечно понимаю, JFF же.

Но

Во-первых, нескольких терабайт пи не хватит.

Хватит, все зависит от длины блока.

Во-вторых, длина ключа-смещения будет превышать длину сжимаемой инфы.

Зависит от способа записи смещения, на бумажке получилось с кучей допущений довести длину ключа до 5 байт.

Опять же, на бумажке оно работать будет, на деле - посмотрим, есть ли реальный смысл - определенно нет.

Если интересно что выйдет, могу на ЛОРе отчитаться и кастануть тебя

mersinvald ★★★★★
() автор топика
Ответ на: комментарий от anonymous

Пора бы таки заигнорить анонимуса.

а уж если вы,идиоты,храните ЧИСЛА ТЕКСТОМ
то уж учитесь думать головой

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

mersinvald ★★★★★
() автор топика
Последнее исправление: mersinvald (всего исправлений: 1)
Ответ на: комментарий от mersinvald

Зачем мне отводить по байту на цифру, как это сделано сейчас, когда в один байт можно загнать две?

Что мешает хранить в одном байте две десятичные цифры?

cPunk ★★
()
Ответ на: комментарий от cPunk

Повторяю еще раз: я знаю что и зачем я делаю.
И я задал вполне конкретный вопрос.

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

mersinvald ★★★★★
() автор топика
Ответ на: комментарий от mersinvald

Похоже, что ты вообще не понимаешь что такое система исчисления.

anonymous
()
Ответ на: комментарий от mersinvald

При чем тут железо?

От железа зависит скорость расчёта. Если у тебя железо мощнее, результат выйдет раньше.

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

Ичо?

hateyoufeel ★★★★★
()
Последнее исправление: hateyoufeel (всего исправлений: 1)
Ответ на: комментарий от mersinvald

на бумажке оно работать будет
с кучей допущений

В том то и оно.

Бесконечно эффективное сжатие, пи

Юнайт цыркле, градусы, радианы... Ты куда-то туда копаешь?

deep-purple ★★★★★
()
Ответ на: комментарий от mersinvald

Да, чем меньше распространяешься, тем меньше видно, что ты сам не понимаешь, чего хочешь. Две десятичные цифры в одном байте и шестнадцатеричная система счисления - совершенно разные вещи. Определись, чего хочешь.

unC0Rr ★★★★★
()
Ответ на: комментарий от unC0Rr

Судя по всему у автора числа записаны в виде текста (не в бинарном виде) в 10 представлении и автор хочет либо перегнать его в текстовую запись числа в 16сс, либо в двоичную и не может связать двух слов.

RiseOfDeath ★★★★
()
Последнее исправление: RiseOfDeath (всего исправлений: 1)

Оно хранится в файле длиной в несколько гигабайт, в дестиричной системе счисления.

Оно хранится только в двоичной, если вы используете стандартный двоичный ЭВМ. Полагаю, речь про ascii?

Нужно перегнать в шестнадцатиричную.

Это как? В стандартном двоичном ЭВМ нет никаких шестнадцатеричных чисел. От слова совсем. Есть шестнадцатеричное представление байта. Почему шестнадцатеричное? Потому что при восьмеричном двухбайтное представление будет отличаться от каждого каждого составляющего его байта. А это неудобно.

И экономия места и экономия ресурсов, число нужно именно в 16-ричном представлении
Зачем мне отводить по байту на цифру, как это сделано сейчас, когда в один байт можно загнать две?

Ээ..Што? А сколько, по-вашему, десятичных цифр в байте? Сколько можно запихнуть в 8 разрядов? Максимально три (255), с утра было. А вы хотите запихивать две? Или вы хотите шестнадцатиразрядные значки (представление) запихивать в ascii? Типа для «экономии»? Каждую тетраду полубайт в байт ascii?

Не знаю, я всю жизнь писал на бейсике и у меня много вопросов. На бейсике я бы запросто перелопатил в бинарную запись, но ждать пришлось бы очень долго в силу неисчислимых дисковых операций. Оперативы для этого много не надо. Можно придумать оптимизацию на свой страх и риск, но я бы не рискнул, если бы от этого зависело что-то важное. Оптимизация заключается в том, что двоичные, в отличие от десятичных, редко меняются в старших разрядах, но зато «хвост» меняется постоянно и меняющийся хвост растёт.

rechnick ★★★
()

А можно пример как выглядит инпут (хотя бы часть) и как должен выглядеть соответсвуюший ему аутпут?

CyberK
()
Ответ на: комментарий от CyberK

Да всё же очевидно, чего вы все тупите: хранится строкой, нужен bigint. ОП, бери gmp.

mix_mix ★★★★★
()
Ответ на: комментарий от mersinvald

Бесконечно эффективное сжатие
И экономия места и экономия ресурсов, число нужно именно в 16-ричном представлении (любом кратном ^2)

Если нужно именно это, то в виде текста в десятичном представлении ужать можно гораздо больше. Можно целые n-символьные последовательности одним байтом представлять.

cPunk ★★
()
Ответ на: комментарий от cPunk

Ужать можно больше в силу того, что символьное представление цифры занимает больше бинарного? Или ещё по какой-то причине? Чёт как-то сомневаюсь я что можно больше. В смысле конечного размера. Хотя я не специалист.

rechnick ★★★
()
Ответ на: комментарий от cPunk

Слава яйцам, хоть один понял, чего я хочу. Да, именно так.

mersinvald ★★★★★
() автор топика
Ответ на: комментарий от cPunk

За исключением того что мне нужны ИМЕННО МАТЬ ИХ 16-РИЧНЫЕ ЧИСЛА
Простите за мой французский, я не знаю как еще это написать, чтобы меня услышали

mersinvald ★★★★★
() автор топика

Зачем вообще кому-то число пи с такой точностью? Я правильно понимаю что тебе просто скучно?

true_admin ★★★★★
()

советую еще про колмогоровскую сложность почитать

SZT ★★★★★
()
Ответ на: комментарий от mersinvald

Что такое, в вашем понимании, 16-ричные числа? То что вы видите в шестнадцатеричном редакторе это не шестнадцатеричные числа. Вы видите представление каждого полубайта в символическом виде, более понятном и запоминающемся. Упрощённо говоря, процессору не нужно никаких особых преобразований, чтоб вывести разряды в виде «шестнадцатеричных чисел». Ему даже тактов не надо, по-идее. Вот например перевести разряды в десятичное представление — вот это задача. Она нетривиальна и имеет несколько решений. Какая задача у вас, я лично, ваще понять не могу. Каждый полубайт записать в «шестнадцатеричный» символ acsii?

rechnick ★★★
()
Ответ на: комментарий от mersinvald

За исключением того что мне нужны ИМЕННО МАТЬ ИХ 16-РИЧНЫЕ ЧИСЛА

Тебе нужен fixed point.

hateyoufeel ★★★★★
()

Прекратите панику, кажись я разгадал что

хочет товарищ ТС.

Тема такая. Мы можем представить число пи (или там кси, или какое угодно) в десятичном виде. Это так: пи=3*10^0 + 1*10^{-1} + 4*10^{-2} + 1*10^{-3} + 5*10^{-4} + ... коэффициенты 1, 4, 1, 5 и т.д. - разложение числа в десятичной системе.

В 16-ти ричной системе счисления это же число можно представить по его коэффициентам разложения: пи=3*16^0 + z1*16^{-1} + z2*16^{z-2} + z3*16^{-3} и т.д. коэффициенты zI - разложение числа пи в 16-ти ричной системе.

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

Я не знаю. Лучше бы смотреть формулу, которой пи было получено изначально и в ней подкручивать чего. Или там из справочника взять. Или пересчитывать из исходных коэффициентов. Или, лучше всего, поймать 9-ти классника-олимпиадника из физ-мат школы. Или там математика из института

sshestov ★★
()

Если а првильно понял то пи по вашему

3,14159265...∞

что в файле если смотреть в hex редакторе (отбросим целую и запятую)
31 34 31 35 39 32 36 35 -аски 8 байт
 1  4  1  5  9  3  6  5 -вид человека (шутка)
---------------
как по мне это -30dec 
что вы хотите получть
14 15 93 65 -4 байта
      ]  A  -первые 2 не смог пропичатать с помошью alt+num_key вроде как и так понятно

при просмотре в hex редакторе

pvvking ★★
()
Последнее исправление: pvvking (всего исправлений: 1)
Ответ на: Прекратите панику, кажись я разгадал что от sshestov

Припоминаю как мантисса хранится в двоичном виде Нужно что-то вроде этого.

 
3.1415926

 n   2^n	m    prev+2^n
 2    4		0	7.0	
 1    2		1	2.0	
 0    1		1	3.0
--------------------------------
-1    0.5	0	<3.5
-2    0.25	0	<3.25
-3    0.125	1	>3.125 = 3.0+0.125
-4    0.0625	0	<3.1875
-5    0.03125	0	<3.15625
-6    0.015625	1	<3.140625 = 3.125 + 0.15625
............

Первые 6 бит уже есть, осталось посчитать остальное.)))

Вычислять 2^n в десятичном виде, складывать его в том же десятичном виде с промежуточным результатом, сравнивать в десятичном же виде с PI.

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

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

Итого, для реализации преобразования придется как-то находить 2 в отрицательных степенях (хз как сделать) в десятичном виде. Сложение в десятичном виде (относительно просто). Сравнение в десятичном виде (совсем легко).

В каком-то стандарте IEEE числа вещественные числа так и упаковываются в виде мантиссы и экспоненты. PI там было бы записано как |11001001... |E10|. А Вас чем точность каких-нибудь 128-битных float (вроде бы столько сейчас процы тянут) не устраивает? Там кажется 83 разряда под мантиссу, а это 2^(-83) = 1.03E-25, т.е. до 25-го десятичного знака.

bugs-bunny
()
6 марта 2016 г.
Ответ на: комментарий от bugs-bunny

Кстати, в FPU есть инструкция, которая переводит BCD во float без потерь — FBLD. Может пригодится.

anonymous
()

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

Как вариант — можешь использовать дерево Штерна-Брокота. По крайней мере перевести в него своё представление сможешь легко.

Legioner ★★★★★
()
Последнее исправление: Legioner (всего исправлений: 1)
Ответ на: комментарий от Legioner

судя по замыслу ТСа, ему вполне можно выдать записанные подряд циферки пи в виде целого числа

f1u77y ★★★★
()
Ответ на: комментарий от pvvking

31 34 31 35 39 32 36 35 -аски 8 байт
1 4 1 5 9 3 6 5 -вид человека (шутка)

проспись, человек (не шутка)

anonymous
()

Off-topic
Число Пи знает что вы делали прошлым летом...
По теме
Если нужен определенный формат - ссылки выше были, если нужно дробную часть как целое число перевести из десятичной сс в другую, то банальные арифметические операции (деление на основание, остаток/деление на осн... ну вы поняли) еще никто не отменял. Куда уж тут быстрее-то :)

znenyegvkby
()

У тебя разницы в скорости не будет - всё упрётся в медленное чтение этого файла в несколько гигов.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.