Здравствуйте, saproj, Вы писали:
V>>Base64 это мощно А чем это хуже? V>>[ccode] V>>void ConvertToString(char* str,float f) { V>> int* pi = (int*)&f; S>После этой строки можно уже прекращать чтение . V>> sprintf(str,"%08X",*pi); S>Плохое решение. На разных платформах int может быть little-endian или big-endian.
Я может чего то непонял? Тебе так и так придётся будет подгонять float и int k разным платформам, так что пример нормальный, просто надо додумать дальше своей головой
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
> Зависит от задачи, конечно. Не зная точно какая задача нет смысла > спорить. Но думаю, что вполне можно назвать извращением передачу 100 с > лишним байт вместо 8 (float) или 12 (double) теряя при этом некоторые > значения.
100 я написал для простоты, при необходимости можно заюзать numeric_limits<>::digits (или что-то около того) и посчитать
точное кол-во — минимальное и без потерь точности.
Posted via RSDN NNTP Server 2.0
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Здравствуйте, saproj, Вы писали:
S>Зависит от задачи, конечно. Не зная точно какая задача нет смысла спорить. Но думаю, что вполне можно назвать извращением передачу 100 с лишним байт вместо 8 (float) или 12 (double) теряя при этом некоторые значения
С каких это пор у float 8 байт? А 12-байтный где взяли?.
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Здравствуйте, Vain, Вы писали:
S>>Зависит от задачи, конечно. Не зная точно какая задача нет смысла спорить. Но думаю, что вполне можно назвать извращением передачу 100 с лишним байт вместо 8 (float) или 12 (double) теряя при этом некоторые значения V>С каких это пор у float 8 байт? А 12-байтный где взяли?.
float и double 4 и 8 байт соотвественно. Речь о другом. Читайте всю ветку.
Здравствуйте, saproj, Вы писали:
S>Здравствуйте, Константин Л., Вы писали:
S>>>Готовую функцию, которая преобразовывает, найти несложно. Но по-моему гораздо интереснее написать самому. Там все очень просто: каждые 6 битов исходной последовательности являются индексом, по которому из массива "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" берется символ. И для 4-байтового float в конце последовательности нужно добавить "хвост" из двух '='.
КЛ>>там все по-другому
S>Что именно по-другому?
Здравствуйте, saproj, Вы писали:
S>>>Зависит от задачи, конечно. Не зная точно какая задача нет смысла спорить. Но думаю, что вполне можно назвать извращением передачу 100 с лишним байт вместо 8 (float) или 12 (double) теряя при этом некоторые значения V>>С каких это пор у float 8 байт? А 12-байтный где взяли?. S>float и double 4 и 8 байт соотвественно. Речь о другом. Читайте всю ветку
ну, на какой платформе ты видел такие типы?
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Если на всех твоих платформах float хранится в IEEE floating-point standard
S>А преобразовывать через int непортабельно даже при выполнении этого условия.
А как ты собираешься превращать float в строку бит?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Tuo_Bellas, Вы писали:
T_B>Нужно сохранить float в строку, без потери точности, портабельно (вариант, непортабельно для PC, Win32, VC 8), причем с возможностью прочесться обратно. Human-readability строки не нужно, нужно только чтобы были "нормальные символы" (hex, наверное все же, 0-9, A-F; хотя, может и 7-bit ASCII пойдет, посмотрим).
Ну, можно воспользоваться тем сокровенным знанием, что float — это двоичное плавающее число. С неизвестной разрядностью и т.д. и т.п.
float f;
int sign = (f<0) ? -1 : (f>0) ? : +1 : 0;
if(f<0) f = -f;
// постусловие: f>=0int power = 0;
while(f>=1.0) { f/=2; ++power; }
while(f<0.5) { f*=2; --power; }
// постусловие: 0.5<=f<1.0long mantissa = 0;
// вот тут надо подумать, как грамотно найти мантиссу.
// может быть, завести известное число float g и методом последовательных приближений приравнять его к f
// одновременно заполняя mantissa