Float в не human-readable строку
От: Tuo_Bellas Россия  
Дата: 26.06.06 16:19
Оценка:
Всем привет!

Нужно сохранить float в строку, без потери точности, портабельно (вариант, непортабельно для PC, Win32, VC 8), причем с возможностью прочесться обратно. Human-readability строки не нужно, нужно только чтобы были "нормальные символы" (hex, наверное все же, 0-9, A-F; хотя, может и 7-bit ASCII пойдет, посмотрим).

Подскажите пожалуйста, какой способ наиболее кошерный.

Спасибо,
Tuo_Bellas.
Re: Float в не human-readable строку
От: saproj  
Дата: 26.06.06 17:50
Оценка: 5 (2)
Здравствуйте, Tuo_Bellas, Вы писали:

T_B>Нужно сохранить float в строку, без потери точности, портабельно (вариант, непортабельно для PC, Win32, VC 8), причем с возможностью прочесться обратно. Human-readability строки не нужно, нужно только чтобы были "нормальные символы" (hex, наверное все же, 0-9, A-F; хотя, может и 7-bit ASCII пойдет, посмотрим).


T_B>Подскажите пожалуйста, какой способ наиболее кошерный.


Если на всех твоих платформах float хранится в IEEE floating-point standard (а сейчас вообще встречаются платформы где это не так?), то преобразовывай в BASE64.
Re[2]: Float в не human-readable строку
От: Tuo_Bellas Россия  
Дата: 26.06.06 18:04
Оценка:
Здравствуйте, saproj, Вы писали:

T_B>>Нужно сохранить float в строку, без потери точности, портабельно (вариант, непортабельно для PC, Win32, VC 8), причем с возможностью прочесться обратно. Human-readability строки не нужно, нужно только чтобы были "нормальные символы" (hex, наверное все же, 0-9, A-F; хотя, может и 7-bit ASCII пойдет, посмотрим).


T_B>>Подскажите пожалуйста, какой способ наиболее кошерный.


S>Если на всех твоих платформах float хранится в IEEE floating-point standard (а сейчас вообще встречаются платформы где это не так?), то преобразовывай в BASE64.


Есть кусок кода? Или нужно мега-библиотеку подключать для этого?

Спасибо,
Tuo_Bellas.
Re: Float в не human-readable строку
От: CreatorCray  
Дата: 26.06.06 18:26
Оценка:
Здравствуйте, Tuo_Bellas, Вы писали:

T_B>Всем привет!


T_B>Нужно сохранить float в строку, без потери точности, портабельно (вариант, непортабельно для PC, Win32, VC 8), причем с возможностью прочесться обратно. Human-readability строки не нужно, нужно только чтобы были "нормальные символы" (hex, наверное все же, 0-9, A-F; хотя, может и 7-bit ASCII пойдет, посмотрим).


T_B>Подскажите пожалуйста, какой способ наиболее кошерный.

можно что нить а-ля Base64
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Re[2]: Float в не human-readable строку
От: Vain Россия google.ru
Дата: 26.06.06 18:45
Оценка:
Здравствуйте, saproj, Вы писали:

S>Здравствуйте, Tuo_Bellas, Вы писали:


T_B>>Нужно сохранить float в строку, без потери точности, портабельно (вариант, непортабельно для PC, Win32, VC 8), причем с возможностью прочесться обратно. Human-readability строки не нужно, нужно только чтобы были "нормальные символы" (hex, наверное все же, 0-9, A-F; хотя, может и 7-bit ASCII пойдет, посмотрим).

T_B>>Подскажите пожалуйста, какой способ наиболее кошерный.
S>Если на всех твоих платформах float хранится в IEEE floating-point standard (а сейчас вообще встречаются платформы где это не так?), то преобразовывай в BASE64.
Base64 это мощно А чем это хуже?
void ConvertToString(char* str,float f) {
  int* pi = (int*)&f;
  sprintf(str,"%08X",*pi);
}

void main() {
  char buff[1024];
  ConvertToString(buff,0.1);
}
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re: Float в не human-readable строку
От: Шахтер Интернет  
Дата: 26.06.06 19:19
Оценка:
Здравствуйте, Tuo_Bellas, Вы писали:

T_B>Всем привет!


T_B>Нужно сохранить float в строку, без потери точности, портабельно (вариант, непортабельно для PC, Win32, VC 8), причем с возможностью прочесться обратно. Human-readability строки не нужно, нужно только чтобы были "нормальные символы" (hex, наверное все же, 0-9, A-F; хотя, может и 7-bit ASCII пойдет, посмотрим).


T_B>Подскажите пожалуйста, какой способ наиболее кошерный.


T_B>Спасибо,

T_B>Tuo_Bellas.

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

Например (предполагаем, что char 8 битный).


float x=???;

unsigned char buf[sizeof (float)];

unsigned char result[2*sizeof (float)+1];

memcpy(buf,&x,sizeof (float));

for(int i=0; i<sizeof(float) ;i++)
  {
   unsigned char c=buf[i];

   result[2*i]=tohex(c&15);
   result[2*i+1]=tohex(c>>4);
  }

result[2*sizeof(float)]=0;

//------------------------------------

unsigned char tohex(unsigned int i) 
 {
  return "0123456789ABCDEF"[i];  
 }
В XXI век с CCore.
Копай Нео, копай -- летать научишься. © Matrix. Парадоксы
Re[3]: Float в не human-readable строку
От: CreatorCray  
Дата: 27.06.06 05:59
Оценка:
Здравствуйте, Vain, Вы писали:

V>Здравствуйте, saproj, Вы писали:


S>>Здравствуйте, Tuo_Bellas, Вы писали:


T_B>>>Нужно сохранить float в строку, без потери точности, портабельно (вариант, непортабельно для PC, Win32, VC 8), причем с возможностью прочесться обратно. Human-readability строки не нужно, нужно только чтобы были "нормальные символы" (hex, наверное все же, 0-9, A-F; хотя, может и 7-bit ASCII пойдет, посмотрим).

T_B>>>Подскажите пожалуйста, какой способ наиболее кошерный.
S>>Если на всех твоих платформах float хранится в IEEE floating-point standard (а сейчас вообще встречаются платформы где это не так?), то преобразовывай в BASE64.
V>Base64 это мощно А чем это хуже?
V>
...
V>


Тем что не портабельно.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Re[3]: Float в не human-readable строку
От: saproj  
Дата: 27.06.06 06:00
Оценка: :)
Здравствуйте, Vain, Вы писали:

T_B>>>Нужно сохранить float в строку, без потери точности, портабельно (вариант, непортабельно для PC, Win32, VC 8), причем с возможностью прочесться обратно. Human-readability строки не нужно, нужно только чтобы были "нормальные символы" (hex, наверное все же, 0-9, A-F; хотя, может и 7-bit ASCII пойдет, посмотрим).

T_B>>>Подскажите пожалуйста, какой способ наиболее кошерный.
S>>Если на всех твоих платформах float хранится в IEEE floating-point standard (а сейчас вообще встречаются платформы где это не так?), то преобразовывай в BASE64.
V>Base64 это мощно А чем это хуже?
V>[ccode]
V>void ConvertToString(char* str,float f) {
V> int* pi = (int*)&f;

После этой строки можно уже прекращать чтение .

V> sprintf(str,"%08X",*pi);


Плохое решение. На разных платформах int может быть little-endian или big-endian.
Re[4]: Float в не human-readable строку
От: CreatorCray  
Дата: 27.06.06 06:02
Оценка:
CC>Тем что не портабельно.
впрочем и с Base64 тоже нифига не портабельно. Тут я и сам ступил.

Вообще ИМХО без потери и портабельно можно сделать только если для сохранения ручками разбирать float на целочисленные варианты значений мантиссы и экспоненты. Ну и собирать при чтении обратно. Причем код сбора/разбора должен быть зависим от представления float на данной платформе.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Re[3]: Float в не human-readable строку
От: saproj  
Дата: 27.06.06 06:27
Оценка:
Здравствуйте, Tuo_Bellas, Вы писали:

S>>Если на всех твоих платформах float хранится в IEEE floating-point standard (а сейчас вообще встречаются платформы где это не так?), то преобразовывай в BASE64.


T_B>Есть кусок кода? Или нужно мега-библиотеку подключать для этого?


Готовую функцию, которая преобразовывает, найти несложно. Но по-моему гораздо интереснее написать самому. Там все очень просто: каждые 6 битов исходной последовательности являются индексом, по которому из массива "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" берется символ. И для 4-байтового float в конце последовательности нужно добавить "хвост" из двух '='.
Re[5]: Float в не human-readable строку
От: saproj  
Дата: 27.06.06 06:36
Оценка:
Здравствуйте, CreatorCray, Вы писали:

CC>>Тем что не портабельно.

CC>впрочем и с Base64 тоже нифига не портабельно.
Почему?
Re[6]: Float в не human-readable строку
От: CreatorCray  
Дата: 27.06.06 06:40
Оценка:
Здравствуйте, saproj, Вы писали:

S>Здравствуйте, CreatorCray, Вы писали:


CC>>>Тем что не портабельно.

CC>>впрочем и с Base64 тоже нифига не портабельно.
S>Почему?
Потому, что если иметь в виду портабельность в общем смысле (а не на конкретный список платформ) то представление float все таки бывает разное. К примеру: попадался как то проц для встраиваемых систем в котором float был 48 бит.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Re[7]: Float в не human-readable строку
От: saproj  
Дата: 27.06.06 06:50
Оценка:
Здравствуйте, CreatorCray, Вы писали:

CC>>>впрочем и с Base64 тоже нифига не портабельно.

S>>Почему?
CC>Потому, что если иметь в виду портабельность в общем смысле (а не на конкретный список платформ) то представление float все таки бывает разное. К примеру: попадался как то проц для встраиваемых систем в котором float был 48 бит.

В своем сообщении я сразу оговорил следующее важное условие.

Если на всех твоих платформах float хранится в IEEE floating-point standard

А преобразовывать через int непортабельно даже при выполнении этого условия.
Re: Float в не human-readable строку
От: kan_izh Великобритания  
Дата: 27.06.06 08:38
Оценка:
Tuo_Bellas wrote:

> Нужно сохранить float в строку, без потери точности, портабельно

> (вариант, непортабельно для PC, Win32, VC 8), причем с возможностью
> прочесться обратно. Human-readability строки не нужно, нужно только
> чтобы были "нормальные символы" (hex, наверное все же, 0-9, A-F; хотя,
> может и 7-bit ASCII пойдет, посмотрим).
Что-то не совсем понял. А чем банальное
double d1,d2;
d1=...;
sprintf(str, "%.100e", d1);
sscanf(buff, "%le", &d2);
assert(d1 == d2);// по идее будет выполнятся, пока точность double на данной платформе меньше 100.

не подойдёт?
Posted via RSDN NNTP Server 2.0
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[4]: Float в не human-readable строку
От: Константин Л. Франция  
Дата: 27.06.06 08:43
Оценка: -1
Здравствуйте, saproj, Вы писали:

S>Здравствуйте, Tuo_Bellas, Вы писали:


S>>>Если на всех твоих платформах float хранится в IEEE floating-point standard (а сейчас вообще встречаются платформы где это не так?), то преобразовывай в BASE64.


T_B>>Есть кусок кода? Или нужно мега-библиотеку подключать для этого?


S>Готовую функцию, которая преобразовывает, найти несложно. Но по-моему гораздо интереснее написать самому. Там все очень просто: каждые 6 битов исходной последовательности являются индексом, по которому из массива "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" берется символ. И для 4-байтового float в конце последовательности нужно добавить "хвост" из двух '='.


там все по-другому
Re[5]: Float в не human-readable строку
От: saproj  
Дата: 27.06.06 10:02
Оценка:
Здравствуйте, Константин Л., Вы писали:

S>>Готовую функцию, которая преобразовывает, найти несложно. Но по-моему гораздо интереснее написать самому. Там все очень просто: каждые 6 битов исходной последовательности являются индексом, по которому из массива "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" берется символ. И для 4-байтового float в конце последовательности нужно добавить "хвост" из двух '='.


КЛ>там все по-другому


Что именно по-другому?
Re: Float в не human-readable строку
От: korzhik Россия  
Дата: 27.06.06 10:07
Оценка:
Здравствуйте, Tuo_Bellas, Вы писали:

T_B>Всем привет!


T_B>Нужно сохранить float в строку, без потери точности, портабельно (вариант, непортабельно для PC, Win32, VC 8), причем с возможностью прочесться обратно. Human-readability строки не нужно, нужно только чтобы были "нормальные символы" (hex, наверное все же, 0-9, A-F; хотя, может и 7-bit ASCII пойдет, посмотрим).


T_B>Подскажите пожалуйста, какой способ наиболее кошерный.


Может здесь
Автор: aka50
Дата: 22.07.04
что нибудь полезное найдёшь.
Re[2]: Float в не human-readable строку
От: saproj  
Дата: 27.06.06 10:15
Оценка:
Здравствуйте, kan_izh, Вы писали:

>> Нужно сохранить float в строку, без потери точности, портабельно

>> (вариант, непортабельно для PC, Win32, VC 8), причем с возможностью
>> прочесться обратно. Human-readability строки не нужно, нужно только
>> чтобы были "нормальные символы" (hex, наверное все же, 0-9, A-F; хотя,
>> может и 7-bit ASCII пойдет, посмотрим).
_>Что-то не совсем понял. А чем банальное
_>
_>double d1,d2;
_>d1=...;
_>sprintf(str, "%.100e", d1);
_>sscanf(buff, "%le", &d2);
_>assert(d1 == d2);// по идее будет выполнятся, пока точность double на данной платформе меньше 100.
_>

_>не подойдёт?

В этом случае будут искажаться специальные значения. Сделай такое присваивание значения переменной d1 и assert будет срабатывать:
    d1=1.123;
    d1/=0;
Re[3]: Float в не human-readable строку
От: kan_izh Великобритания  
Дата: 27.06.06 10:34
Оценка:
saproj wrote:

>> > Нужно сохранить float в строку, без потери точности, портабельно

...
> _>sprintf(str, "%.100e", d1);
...
> В этом случае будут искажаться специальные значения. Сделай такое
> присваивание значения переменной d1 и assert будет срабатывать:
>
> d1=1.123;
> d1/=0;
Да, согласен, но спецзначения можно специально обработать (а это, вообще говоря, далеко не всегда нужно), их всего
несколько штук. Зато портабельно, без всяких извращений типа base64 и надежды на определённый формат бинарного
представления в памяти.
Posted via RSDN NNTP Server 2.0
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[4]: Float в не human-readable строку
От: saproj  
Дата: 27.06.06 11:11
Оценка:
Здравствуйте, kan_izh, Вы писали:

>>> > Нужно сохранить float в строку, без потери точности, портабельно

_>...
>> _>sprintf(str, "%.100e", d1);
_>...
>> В этом случае будут искажаться специальные значения. Сделай такое
>> присваивание значения переменной d1 и assert будет срабатывать:
>>
>> d1=1.123;
>> d1/=0;
_>Да, согласен, но спецзначения можно специально обработать (а это, вообще говоря, далеко не всегда нужно), их всего
_>несколько штук. Зато портабельно, без всяких извращений типа base64 и надежды на определённый формат бинарного
_>представления в памяти.

Зависит от задачи, конечно. Не зная точно какая задача нет смысла спорить. Но думаю, что вполне можно назвать извращением передачу 100 с лишним байт вместо 8 (float) или 12 (double) теряя при этом некоторые значения.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.