Скачать MetaTrader 5

string 2 double, и обратно

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Сергей
712
Сергей  

в глобальных переменных можно хранить только значения типа double а хочется/нужно сохранить string.

в справке написано что

Внутреннее представление - число двойной точности размером 8 байт. Пределы изменения от -1.7 * e-308 до 1.7 * e308. Точность обеспечивается не более, чем 15 значащими цифрами.

получается вроде как в double можно запихнуть 8 любых(?) символов. но... плавающая арифметика - вещь приблизительная. можно ли быть уверенным что поочереди выдергивая символы символы строки и умножая их на нужное количество 256 я всегда останусь с нужной точностью и ни на каких (самых) старших разрядах внутренне представление не начнется "округляться" до каких то круглых значений с этими самыми "e-308" ?

т.е. могу ли я любую последовательность 8 символов "закодировать" в double, сохранить его в глобальной переменной, а потом прочитав ее - "декодировать" double обратно строку (без потерь)?

Комбинатор
16100
Комбинатор  
Дык если засунул биты, затем достал биты, то какая потеря? Только вот если биты напрямую, если шаманить с самим значением, другой разговор.
Vladimir Gomonov
8292
Vladimir Gomonov  
f.t.:

в глобальных переменных можно хранить только значения типа double а хочется/нужно сохранить string.

Храни в текстовых строках экранных объектов. Чем не глобальные переменные? Даже лучше.. :)
Комбинатор
16100
Комбинатор  
Тоже ограничение, только больше, 64 символа. А так хорошо, главное график не закрыть нечаянно.
Сергей
712
Сергей  
TheXpert:
Дык если засунул биты, затем достал биты, то какая потеря? Только вот если биты напрямую, если шаманить с самим значением, другой разговор.

дык еслибы я знал что засовываю именно быты ;)

вот например два символа "AB" A = 65 B = 66 получаю 65*256 + 66 = 16706

а если "AB123456" то первый символ 65 нужно умножать на 256 аж семь раз. опасаюсь что внутреннее преобразование начнет приводить такое к чемуто округленному с вот теми степенями (e-308) и число 4702375052605404200 округлится до чегото вроде 47023750526 e+8 (00000000) если такое произойдет - декодировать обратно не получится :(

Сергей
712
Сергей  
MetaDriver:
Храни в текстовых строках экранных объектов. Чем не глобальные переменные? Даже лучше.. :)
хорошая мысль! но через глобальную переменную я строку могу отдать куче разных чартов, а через строку - только своему одному.
Комбинатор
16100
Комбинатор  

Можно кодировать только 4 байта, т.е. инт, он в дабл без потерь вроде влазит при любом значении. Правда емкость в 2 раза меньше.

Напрямую биты писать способа не вижу кроме как длл, но тогда проще строки передавать сразу.

Сергей
712
Сергей  
TheXpert:

.... вроде влазит....

я вот тоже об слово "вроде" споткнулся :(

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

Vladimir Gomonov
8292
Vladimir Gomonov  

В сторону...: Я вапче всё пишу в файлы и не парюсь. Оснований нету - скорость устраивает. Вот когда РЕАЛЬНО не устроит - тогда может и понапрягаюсь.

А пока я только в выигрыше - именно по скорости*простота=надёжность.

// Ах да, забыл добавить - когда-то ведь напрягался! Пока не попробовал тупо передавать через файлы.

// Для справки - при быстром обмене небольшими порциями инфа похоже вообще берётся (при чтении) из системного кэша.

// Другим способом высокое быстродействие передачи через файлы объяснить не могу. (: Хотя может и не надо? :)

Сергей
712
Сергей  

ерунда получается:

void start()
{
  string str = "1яяяяя"; 
  double v = String2Double(str);
  Print(v);
  Print(Double2String(v));
}

double String2Double(string str)
{
  int len = StringLen(str); if ( len > 5 ) { len = 5; str = StringSubstr(str, 0, len); }
  double res = 0; for ( int i = 0; i < len; i++ ) res = res * 256.0 + StringGetChar(str, i);
  return(res);
}

string Double2String(double val)
{
  string str = "";
  while (val > 0) 
  { 
    string s = DoubleToStr( val / 256.0 ,16);  
    int p = StringFind(s,".");
    double v1 = StrToDouble(StringSubstr(s,0,p));
    double v2 = StrToDouble(StringSubstr(s,p));
    str = CharToStr(v2*256.0) + str;
    val = v1; 
  }
  return (str);
}

знаковый разряд нормально не обработаеш и в результате гарантировано можно хранить/декодировать только ПЯТЬ символов.

тогда уж проще действительно через объект на чарте передавать...

o_o
Модератор
23915
o_o  

а какой смысл в этих танцах?

если вы желаете всего 8 символов - то зачем вообще использовать double как посредника? Пишите нужную строку сразу в название переменной.

типа <имя>.<значение>

string name="мой идентификатор GV";
string val="что-то тут"; // 8 символов
GlobalVariableSet(name+"."+val, true);


при чтении GV выбираем их по идентификатору name+"."

123
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий