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)
Запись числа в файл
Как сделать так, чтобы число при записи представлялось не в виде цифр, а всеми возможными символами, чтобы уменьшить размер файла, в котором записано куча таких чисел?
Не понял немного смысл вопроса. double это как правило и есть 8-ми байтовое число. Вернее 8 байт памяти в котором храниться мантисса и порядок. Как хочешь соптимизировать - хранить только значимые n символов после запятой или как?
Имеем число 35,67 и весит оно 5 байт. Кома - третий байт етого числа, убераем ее (3567), ставим <розряд> комы, в данном случае ето три, в конец етого числа, получаем: 35673. Переводим число в Hex систему, получаем: 8B59, розбивем по два байта: 8B и 59, и записываем их в файл. Ну вот, число, которое изначально занимало целых пять байт, уместилось в двух!
Когда надо <достать> из файла дробное число, делаем следующее: вынимаем ети два байта, ставим рядом (8B59), переводим в десятичную систему (35673), берем последний байт (3), когда его взяли - режем число 35673 и получаем 3567. Если запятая стоит на третем байте - берем первых два байта (35), ставим после них запятую и пришываем остаток (67). В итоге получаем лробное число 35,67.
Или я че-то не понял ?
Имеем число 35,67 и весит оно 5 байт.
[/QUOTE]
Это с чего вдруг? Если толко это не число, а строка в которой записанно число. Но это уже не число само по себе.
[QUOTE=Bard]Переводим число в Hex систему, получаем: 8B59, розбивем по два байта: 8B и 59, и записываем их в файл.
[/QUOTE]
И не вижу разницы в какой системе счисления записывать в файл. Число и количество байт для него необходимое от этого не измениться. :))
Вобщем все хорошо, но double на то и double - что это число с плавающией запятой повышенной точности. И эту точность врятли компактней представишь, хотя данные в нем как раз так и хранятся примерно как описал Bard. Только там храниться какое то число. И порядок - тоесть степень на в которую нужно возвести основание системы, чтобы получить исходное. Другое дело что можно пожертвовать точностью, но до какой степени ей можно пожертвовать (до какой степени десятки или двойки. Отрицательной или положительной :))) вот в чем вопрос - автору темы )
Hex система служит для компактной записи чисел. А Heo, как я понял, надо записать дробное число в файл. Да, при вычисленни оно может и будет весить 8 байт, но мы говорим о хранении и зжатии числа, а не про то, какая разница в какой системе, главное чтобы было компактно!
Два байта лучше чем восемь.
Цитата:
Hex система служит для компактной записи чисел.
Шестнадцатиричная система счисления служит лишь для представления чисел в этой системе. Она никак не влияет на компактность или сжатие. Число оно одно - и в нем всегда одинаковое количество информации, в какой системе его не предстваляй. Если учесть еще что в машине они все равно представляются едино ))) Хоспади учите математику прежде чем програмировать ))
И сжать просто так не получиться сколько хочешь - есть такое понятие информационная энтропия (по Шенону). Так вот просто так ниоткуда сжатие не возьмется - количество информации здесь всегда одно. Сжатие возможно за счет искоринения избыточности или за счет потерь какого то количества информации.
В каком числе (строке) больше байт ?!
[FONT="Courier New"]5114029029480273966 Dec[/FONT]
и
[FONT="Courier New"]46F8AE4E9935182E Hex[/FONT]
Я конечно согласан, что нельзя сжать без потерь, но выше сказанное тоже факт!
[FONT="Courier New"]5114029029480273966 Dec[/FONT]
и
[FONT="Courier New"]46F8AE4E9935182E Hex[/FONT]
[/QUOTE]
Определись уж о числах или строках идет речь? =))
Если о числах - то без сомнения одинаковое :D Вернее будет сказать для их хранения требуется абсолютно одинаковое количество байт. А системы счисления лишь способ представления числа :))
Если о строках - то при чем тут числа? :)) Разговор всетаки был о числах хранящихся в double а не о их символьном представлении =))
Запись в строчку да займет больше места, но запись - это представление, а не само число =))
Фактов к слову там не разглядел :))
Тему внимательно читай !!!
[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]
Как сделать так, чтобы число при записи представлялось не в виде цифр, а всеми возможными символами, чтобы уменьшить размер файла, в котором записано куча таких чисел?[/quote]
ну собственно, переводить числов в строку и сохранять. где проблема то?
Хотя суть темы не понятна.
Ну так я не о символах говорю! Символы используються только в самом алгоритмае сжатия и восстановления, а не в самом файле. Файл с сжатым числом 35,67, выглядит так: 8B 59. Как видно - всего два байта!
Короче, есть число double a, занимает 8 байт.
После запятой не знаю, сколько знаков, наверное, около 14.
Если представить в символьной записи, то тогда будет около 14 байт, а это нехорошо. Плюс ко всему, когда я записывал в символьной записи в файл, писалось 0. и 6 цифр, т.е. число обрезалось, и выходили те же 8 байт. Я хочу, чтобы хранилось полное число в файле, притом чтобы занмало меньше места. Поэтому нужно в символьной записи не цифрами, а абсолютно любыми символами: буквами, знаками и т.п.
Вот меня интересует именно то, как именно это организовать. Число не обязательно меньше единицы, может быть и отрицательное.
И сразу еще один вопрос: как лучше разделять числа между собой?
Приведи пример етого Double числа.
Чето я совсем отстал от жызни... С каких это пор числа представляются символами?
С тех пор, когда появилась шестнадцатиричная система исчисления.
Код:
Иными словами, не важно, как число записывается, важно что оно занимает sizeof(себя) байт.
Символьное представление чисел, это лишь видимая компрессия:
На примере целых(так понятние):
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 ?? Да!
как видно символное представление не сжимает числа.
==> Видно если у вас маленькие числа, можете попробывать просто писать числа в символьном виде, а так нет смысла
- Изготовители компов не дураки, они каждый битик используют для хранения информации.
Насколько я понял, человека, начавшего тему, интересует именно "как записывать число в файл не строчкой"
Человек спрашивает, как можно уменьшить место занимаемое в файле типом double. Ответ - никак, только выбрать тип float в качестве замены.
В теме как раз не сказанно внятно, что хочет автор =))
А мы то как раз говорили, что число не сожмешь переводом в другую систему счисления =))
[QUOTE=Bard]С тех пор, когда появилась шестнадцатиричная система исчисления.[/QUOTE]
Блин, учите уже матчасть прежде чем такое говорить =))
16-ти ричная система счисления (не исчисления) используется потому, что ее она кратна двоичной (тоесть основание является степенью двойки), которая используеться в компьютерной технике. И потому в ней удобно представлять двоичные круглые и дробные числа - и визуально запись числа более компактное )
А если уж судить в таком духе, то запись числа в 37-ричной системе занимает еще меньше места =))
Вобщем непонятно, если автор хочет добиться сжатия - то можно вопервых пожертвовать не значащими знаками. И как вариант привести к float. Только при этом есть одна загвоздка - число может просто не влезть в float. Посколько точка всетаки плавающая, то все эти байты где оно хранится в double могут использоваться как для хранения какой то части, которая будет дробной, так и полностью для целой части числа с отсутствующей дробный. Вот тогда то значение не уместится в float, и нечем будет принибречь.
Потом сжатия добитваются другими способами - для этого есть всем известные алгоритмы сжатия. Если уж есть такое желание хранить строками - то текст тоже неплохо сжимаеться как обычными так и словарными. Тут еще не понятно правда где будет выигрышь. Нужно проанализировать характер и объем возможных данных )
Ммда, только тогда еще ASCов небыло. Числа представляются по-разному (целые, с плавающей точкой...), но никогда не символами. Символами же представляются только символы и строки. А то, что хочет осущесвить начавший тему можно придумав свою талдычку. Но именно в целях экономии места зделаны разные типы чисел. Ведь в базах данных они тоже существуют а их не такие уже и дураки придумывали.
double a=...;
...
fwrite(&a,sizeof(a),1,file);
ну, понимающие люди догадались, в чем тут дело )))
Например, число double d=100.0/199;
Тогда d=0.50251256281407031 - длина этой строчки 21
Если вывести в поток, например, cout << d или аналогично в файл, то выведется 0.502513
Нужно, во 1-х, чтобы записать в файл число полностью, а во-вторых, чтобы не было таким длинным!
Тип double - 8 байт, а не 21, значит, и в файле тоже может занимать 8 байт!
Вопрос как раз в том, КАК это организовать?
В с++ вроде шарю, но не сталкивался с memcpy. Что это такое?
То, что написал aragaer, эот как раз то, что мне надо или нет?
Все, тему можно закрывать.
Повеселили наславу!
всёравно вся инфа в конечном итоге храница в BIN
Например:
cout.precision(8);
cout << 19.6842236; // будет выведено 19,684224, тоесть будет выведено 8 цифр, причем с округлением.
Автор наверно решил обрести неслабого геморроя с записью в файл простых чисел, а потом и с чтением.
Простая идея - сжимать файл после записи разве не решает поставленную проблему? Например обычным zlib, который в каждой винде есть.
зато писать будешь просто double и читать потом тоже.