Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Запись числа в файл

8.1K
07 августа 2006 года
Нео
48 / / 30.07.2006
Если число типа double записать в файл обычными методами, то оно будет занимать 8-9 байт.
Как сделать так, чтобы число при записи представлялось не в виде цифр, а всеми возможными символами, чтобы уменьшить размер файла, в котором записано куча таких чисел?
240
07 августа 2006 года
aks
2.5K / / 14.07.2006
Не понял немного смысл вопроса. double это как правило и есть 8-ми байтовое число. Вернее 8 байт памяти в котором храниться мантисса и порядок. Как хочешь соптимизировать - хранить только значимые n символов после запятой или как?
282
07 августа 2006 года
Bard
481 / / 26.02.2006
Не знаю точно, может я и ошибаюсь, но мне кажеться что можно так:
Имеем число 35,67 и весит оно 5 байт. Кома - третий байт етого числа, убераем ее (3567), ставим <розряд> комы, в данном случае ето три, в конец етого числа, получаем: 35673. Переводим число в Hex систему, получаем: 8B59, розбивем по два байта: 8B и 59, и записываем их в файл. Ну вот, число, которое изначально занимало целых пять байт, уместилось в двух!

Когда надо <достать> из файла дробное число, делаем следующее: вынимаем ети два байта, ставим рядом (8B59), переводим в десятичную систему (35673), берем последний байт (3), когда его взяли - режем число 35673 и получаем 3567. Если запятая стоит на третем байте - берем первых два байта (35), ставим после них запятую и пришываем остаток (67). В итоге получаем лробное число 35,67.

Или я че-то не понял ?
240
07 августа 2006 года
aks
2.5K / / 14.07.2006
[QUOTE=Bard]Не знаю точно, может я и ошибаюсь, но мне кажеться что можно так:
Имеем число 35,67 и весит оно 5 байт.
[/QUOTE]
Это с чего вдруг? Если толко это не число, а строка в которой записанно число. Но это уже не число само по себе.

[QUOTE=Bard]Переводим число в Hex систему, получаем: 8B59, розбивем по два байта: 8B и 59, и записываем их в файл.
[/QUOTE]
И не вижу разницы в какой системе счисления записывать в файл. Число и количество байт для него необходимое от этого не измениться. :))

Вобщем все хорошо, но double на то и double - что это число с плавающией запятой повышенной точности. И эту точность врятли компактней представишь, хотя данные в нем как раз так и хранятся примерно как описал Bard. Только там храниться какое то число. И порядок - тоесть степень на в которую нужно возвести основание системы, чтобы получить исходное. Другое дело что можно пожертвовать точностью, но до какой степени ей можно пожертвовать (до какой степени десятки или двойки. Отрицательной или положительной :))) вот в чем вопрос - автору темы )
282
07 августа 2006 года
Bard
481 / / 26.02.2006
[QUOTE=aks]И не вижу разницы в какой системе счисления записывать в файл. Число и количество байт для него необходимое от этого не измениться.[/QUOTE]
Hex система служит для компактной записи чисел. А Heo, как я понял, надо записать дробное число в файл. Да, при вычисленни оно может и будет весить 8 байт, но мы говорим о хранении и зжатии числа, а не про то, какая разница в какой системе, главное чтобы было компактно!

Два байта лучше чем восемь.
240
07 августа 2006 года
aks
2.5K / / 14.07.2006
Ты кажется не понял ни слова, что я сказал? =((
Цитата:

Hex система служит для компактной записи чисел.


Шестнадцатиричная система счисления служит лишь для представления чисел в этой системе. Она никак не влияет на компактность или сжатие. Число оно одно - и в нем всегда одинаковое количество информации, в какой системе его не предстваляй. Если учесть еще что в машине они все равно представляются едино ))) Хоспади учите математику прежде чем програмировать ))
И сжать просто так не получиться сколько хочешь - есть такое понятие информационная энтропия (по Шенону). Так вот просто так ниоткуда сжатие не возьмется - количество информации здесь всегда одно. Сжатие возможно за счет искоринения избыточности или за счет потерь какого то количества информации.

282
07 августа 2006 года
Bard
481 / / 26.02.2006
[QUOTE=Bard]Hex система служит для компактной записи чисел.[/QUOTE]
В каком числе (строке) больше байт ?!

[FONT="Courier New"]5114029029480273966 Dec[/FONT]
и
[FONT="Courier New"]46F8AE4E9935182E Hex[/FONT]

Я конечно согласан, что нельзя сжать без потерь, но выше сказанное тоже факт!
240
07 августа 2006 года
aks
2.5K / / 14.07.2006
[QUOTE=Bard]В каком числе (строке) больше байт ?!
[FONT="Courier New"]5114029029480273966 Dec[/FONT]
и
[FONT="Courier New"]46F8AE4E9935182E Hex[/FONT]
[/QUOTE]
Определись уж о числах или строках идет речь? =))
Если о числах - то без сомнения одинаковое :D Вернее будет сказать для их хранения требуется абсолютно одинаковое количество байт. А системы счисления лишь способ представления числа :))

Если о строках - то при чем тут числа? :)) Разговор всетаки был о числах хранящихся в double а не о их символьном представлении =))
Запись в строчку да займет больше места, но запись - это представление, а не само число =))

Фактов к слову там не разглядел :))
282
07 августа 2006 года
Bard
481 / / 26.02.2006
[QUOTE=Нео][SIZE="7"]Как сделать так, чтобы число при записи представлялось не в виде цифр, а всеми возможными символами, чтобы уменьшить размер файла[/SIZE][/QUOTE]

Тему внимательно читай !!!
2
07 августа 2006 года
squirL
5.6K / / 13.08.2003
[quote=Bard]В каком числе (строке) больше байт ?!

[FONT=Courier New]5114029029480273966 Dec[/FONT]
и
[FONT=Courier New]46F8AE4E9935182E Hex[/FONT]

Я конечно согласан, что нельзя сжать без потерь, но выше сказанное тоже факт![/quote]

эээ! юноша, не путайте теплое с мягким. в СТРОКАХ

[FONT=Courier New]5114029029480273966[/FONT]
[FONT=Courier New]и[/FONT]
[FONT=Courier New]46F8AE4E9935182E[/FONT]
[FONT=Courier New][/FONT]
[FONT=Courier New]байт разное количество.[/FONT]
[FONT=Courier New]а вот в числах - одинаковое.[/FONT]
[FONT=Courier New]и кстати - сжатие без потерь возможно. все зависит от того, что сжимаете.[/FONT]
2
07 августа 2006 года
squirL
5.6K / / 13.08.2003
[quote=Нео]Если число типа double записать в файл обычными методами, то оно будет занимать 8-9 байт.
Как сделать так, чтобы число при записи представлялось не в виде цифр, а всеми возможными символами, чтобы уменьшить размер файла, в котором записано куча таких чисел?[/quote]
ну собственно, переводить числов в строку и сохранять. где проблема то?
334
07 августа 2006 года
HexEdit
809 / / 27.07.2006
Символьное представление только увеличит размер файла.
Хотя суть темы не понятна.
282
07 августа 2006 года
Bard
481 / / 26.02.2006
to HexEdit
Ну так я не о символах говорю! Символы используються только в самом алгоритмае сжатия и восстановления, а не в самом файле. Файл с сжатым числом 35,67, выглядит так: 8B 59. Как видно - всего два байта!
8.1K
07 августа 2006 года
Нео
48 / / 30.07.2006
Мож меня не так поняли?
Короче, есть число double a, занимает 8 байт.
После запятой не знаю, сколько знаков, наверное, около 14.
Если представить в символьной записи, то тогда будет около 14 байт, а это нехорошо. Плюс ко всему, когда я записывал в символьной записи в файл, писалось 0. и 6 цифр, т.е. число обрезалось, и выходили те же 8 байт. Я хочу, чтобы хранилось полное число в файле, притом чтобы занмало меньше места. Поэтому нужно в символьной записи не цифрами, а абсолютно любыми символами: буквами, знаками и т.п.
Вот меня интересует именно то, как именно это организовать. Число не обязательно меньше единицы, может быть и отрицательное.
И сразу еще один вопрос: как лучше разделять числа между собой?
282
07 августа 2006 года
Bard
481 / / 26.02.2006
Приведи пример етого Double числа.
13K
07 августа 2006 года
V.V.V.
59 / / 21.07.2006
Чето я совсем отстал от жызни... С каких это пор числа представляются символами?
282
07 августа 2006 года
Bard
481 / / 26.02.2006
С тех пор, когда появилась шестнадцатиричная система исчисления.
16K
08 августа 2006 года
aragaer
25 / / 28.07.2006
Мды...
 
Код:
double my_number = MY_DEFINED_NUMBER;
char buf[sizeof(double)+1];
memcpy(buf, (char *)my_number, sizeof(double));
buf[sizeof(double)] = 0;
fprintf(my_file_handle, "%s", buf)
Ну или что-то в этом духе.

Иными словами, не важно, как число записывается, важно что оно занимает sizeof(себя) байт.
1.9K
08 августа 2006 года
[*]Frosty
278 / / 17.06.2006
Короче, сжать числа у вас не получить, объясняю:

Символьное представление чисел, это лишь видимая компрессия:
На примере целых(так понятние):
5 - 0000 0000 0000 0000 0000 0000 0000 0101 - 1 байт против 4 ????, но смотрим дальше
5555 - 0000 0000 0000 0000 0000 0001 0101 1011 0011 - 4 против 4 ??? стоит задуматься
55555555 - 0000 0011 0100 1111 1011 0101 1110 0011 - 8 против 4 ?? Да!
как видно символное представление не сжимает числа.
==> Видно если у вас маленькие числа, можете попробывать просто писать числа в символьном виде, а так нет смысла
- Изготовители компов не дураки, они каждый битик используют для хранения информации.
16K
08 августа 2006 года
aragaer
25 / / 28.07.2006
Насколько я понял, человека, начавшего тему, интересует именно "как записывать число в файл не строчкой"
1.9K
08 августа 2006 года
[*]Frosty
278 / / 17.06.2006
Человек спрашивает, как можно уменьшить место занимаемое в файле типом double. Ответ - никак, только выбрать тип float в качестве замены.
240
08 августа 2006 года
aks
2.5K / / 14.07.2006
[QUOTE=Bard]Тему внимательно читай !!![/QUOTE]
В теме как раз не сказанно внятно, что хочет автор =))
А мы то как раз говорили, что число не сожмешь переводом в другую систему счисления =))

[QUOTE=Bard]С тех пор, когда появилась шестнадцатиричная система исчисления.[/QUOTE]
Блин, учите уже матчасть прежде чем такое говорить =))
16-ти ричная система счисления (не исчисления) используется потому, что ее она кратна двоичной (тоесть основание является степенью двойки), которая используеться в компьютерной технике. И потому в ней удобно представлять двоичные круглые и дробные числа - и визуально запись числа более компактное )
А если уж судить в таком духе, то запись числа в 37-ричной системе занимает еще меньше места =))

Вобщем непонятно, если автор хочет добиться сжатия - то можно вопервых пожертвовать не значащими знаками. И как вариант привести к float. Только при этом есть одна загвоздка - число может просто не влезть в float. Посколько точка всетаки плавающая, то все эти байты где оно хранится в double могут использоваться как для хранения какой то части, которая будет дробной, так и полностью для целой части числа с отсутствующей дробный. Вот тогда то значение не уместится в float, и нечем будет принибречь.
Потом сжатия добитваются другими способами - для этого есть всем известные алгоритмы сжатия. Если уж есть такое желание хранить строками - то текст тоже неплохо сжимаеться как обычными так и словарными. Тут еще не понятно правда где будет выигрышь. Нужно проанализировать характер и объем возможных данных )
13K
08 августа 2006 года
V.V.V.
59 / / 21.07.2006
[QUOTE=Bard]С тех пор, когда появилась шестнадцатиричная система исчисления.[/QUOTE]
Ммда, только тогда еще ASCов небыло. Числа представляются по-разному (целые, с плавающей точкой...), но никогда не символами. Символами же представляются только символы и строки. А то, что хочет осущесвить начавший тему можно придумав свою талдычку. Но именно в целях экономии места зделаны разные типы чисел. Ведь в базах данных они тоже существуют а их не такие уже и дураки придумывали.
7.3K
09 августа 2006 года
Necro666
17 / / 20.07.2004
В духе этого треда отвечу: чтобы число занимало как можно меньше места в файле, если его можно представлять любыми символами, удобнее всего перевесте его в 256-ричную систему. Проще всего это делается так:

double a=...;
...
fwrite(&a,sizeof(a),1,file);

ну, понимающие люди догадались, в чем тут дело )))
8.1K
09 августа 2006 года
Нео
48 / / 30.07.2006
Да, именно это я и имел в виду - типа 256-ричной системы!
Например, число double d=100.0/199;
Тогда d=0.50251256281407031 - длина этой строчки 21
Если вывести в поток, например, cout << d или аналогично в файл, то выведется 0.502513
Нужно, во 1-х, чтобы записать в файл число полностью, а во-вторых, чтобы не было таким длинным!
Тип double - 8 байт, а не 21, значит, и в файле тоже может занимать 8 байт!
Вопрос как раз в том, КАК это организовать?
В с++ вроде шарю, но не сталкивался с memcpy. Что это такое?
То, что написал aragaer, эот как раз то, что мне надо или нет?
8.1K
09 августа 2006 года
Нео
48 / / 30.07.2006
Necro666, огромное спасибо, работает твой fwrite, именно то, что было нужно. Никогда раньше просто с такой проблемой не сталкивался.
Все, тему можно закрывать.
3
10 августа 2006 года
Green
4.8K / / 20.01.2000
Не... я её в раздел Юмор переношу.
Повеселили наславу!
339
10 августа 2006 года
verybadbug
619 / / 12.09.2005
ГЫ... :D
всёравно вся инфа в конечном итоге храница в BIN
1.9K
10 августа 2006 года
[*]Frosty
278 / / 17.06.2006
2 Нео: При выводе cout << d число выводиться в символьном представлении причем с заданой точностью, по умолчанию 6. Она управляеться с помощью функции streamsize precision(streamsize n)
Например:
cout.precision(8);
cout << 19.6842236; // будет выведено 19,684224, тоесть будет выведено 8 цифр, причем с округлением.
5
12 августа 2006 года
hardcase
4.5K / / 09.08.2005
Да, темка весёленькая.
Автор наверно решил обрести неслабого геморроя с записью в файл простых чисел, а потом и с чтением.
Простая идея - сжимать файл после записи разве не решает поставленную проблему? Например обычным zlib, который в каждой винде есть.
зато писать будешь просто double и читать потом тоже.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог