Преобразования double - страница 3

 
Kadet:

Что Вам ещё по программированию рассказать?

Хоть вопрос адресован не мне, отвечу: прежде чем вступать в дискуссию, научитесь слушать собеседника.

 
VladislavVG:

Успехов.

Спасибо! Но не легче.

komposter:Хоть вопрос адресован не мне, отвечу: прежде чем вступать в дискуссию, научитесь слушать собеседника.

Спасибо, учту.

Это террада - ответ на фразу: "Почитали б че-нить по программированию".

Я считю, что она тоже некорректна.

Приношу извинения если обидел.

 

А вообще-то странно, чтобы современный язык программирования, тем более ещё и сделанный на основе "С" - и не распознавал такой простой лексемы как 1е+n... :(

Ла-а-адно... Будем искать решение...

Всем спасибо.

 
Kadet:
komposter писал (а):
А проверить самому лень?
for ( int i = 10; i <= 300; i += 10 ) Print( MathPow(0.1,i) );

Проверил... :)))) - результат - 0, 0, 0, 0,...., 0, 0.

Видимо всё же - 0, т.е. не перевело в double, а оставило в int - т.е. - 0.

Даже:

for ( int i = 10; i <= 300; i += 10 ) Print( NormalizeDouble(MathPow(0.1,i), 308) );
Не помогло. Всё одно - "0".

Вот человек мучается!
Повторяю:

for ( int i = 10; i <= 300; i += 10 ) Print( DoubleToStr(NormalizeDouble(MathPow(0.1,i), 308) ,308));     //>:D)))))))))))
 

Korey

Уже делал. Спасибо. Проверял. Идёт до 8-го знака. дальше не показывает, ибо процедура DoubleToStr() позволяет печатать double только до 8-го знака. Поэтому запись - DoubleToStr(NormalizeDouble(MathPow(0.1,i), 308),308) - не корректна.

Только эта процедура, MathPow (), не подходит, ибо при присвоении значения константам она недопустима. А мне именно константу нужно описать.

Проблему решил кардинально.

Просто тупо набил 300 нулей и всё. Схавал. :))) Хотя правильно ли работать будет при таких записях - пока не знаю.

 
Kadet:

Просто тупо набил 300 нулей и всё. Схавал. :))) Хотя правильно ли работать будет при таких записях - пока не знаю.

Мне почему-то кажется, что не будет.

Может не стоит так широко границы растопыривать, может ограничиться тем, что MQL реально может кушать?

10 в трехсотой степени, зачем?

Вообще MQL очень ограниченный язык, народ давно уже жалуется, что не хватает разрядности в тестере для граальных профитов.

 
Kadet:

Вы, наверное здесь самый умный (уж извините за резкость):

Не,  не самый умный - есть еще люди, которые не только читают стандарты но и пытаются понять, что там написано :).

Размер мантисы в C++: - double - 10 в степени +\-384

??????????????????

:). ИМХО, неплохо бы начать с азов и попытаться разобраться чем мантисса отличается от диапазрона изменения. Как количество значащих цифр влияет на точность представления числа ет сетера.

То, что Вы написали - это диапазон изменения в котором значащих цифр все равно 15, в какую бы степень Вы это число ни возвели. Do Y anderstand me ?

Если Вы не понимаете разницу, то в численных методах дальше даже и ходить не нужно ;).

А это Вы откуда взяли ???? Это не соотвествует ISO/IES 14882:2003


Тип данных:
Размер в байтах:
Численный разброс:
Char
1
один символ
Short
2
от -2^8 до 2^8
Int
4
от -2^16 до 2^16
Float
4
от -2^16 до 2^16
Long
4
от -2^16 до 2^16
Double
8
от -2^32 до 2^32
Long Double
8
от -2^32 до 2^32
Unsigned Short
2
от 0 до 2^16
Unsigned Int
4
от 0 до 2^32
Unsigned Float
4
от 0 до 2^32
Unsigned Double
8
от 0 до 2^64

В MQL-4 тип int почти соответствует С-шному - long int, a double - почти соответствует long double (Почему-то несколько битов не исполюзуются).


Нет, в МКЛ дабл не соотвествует даже С-шному поскольку и диапазон и количество значащих меньше. Не говоря уже о лонг дабл - для его хранения в С выделяется 10 (а не 8) байт...

Незачот, вобщем. На переэкзаменовку ;).


ЗЫ не обижайтесь:  задеть Вас целью не ставил - просто одни и те же грабли и никто не хочет смотреть форум.



Успехов.

 

to Kadet

Так напишите для народа функцию DoubleToFormat(d,"G24.16") &, FormatToDouble(" string") - Bам зачтется!

 

М-да...

Тему нужно обозвать - "Весёлая математика на MQL-4"... :)))

Набил же я нули вручную и решил проверить напечатать в Print() эти константы....

Вот уж не знаю, то ли Print-у разрядности не зватает, толи цифры компелятор неправильно понимает.

Там где - 1е-n - везде выдало нули - "= 0".

А там где - 1е+n - выдало - "= 1000000000000000100000000000000000000000000000000000000000000000000000".

Больше всего беспокоит эта преславутая единица в 17-м разряде... Интересно это только так представляется на печать или так оно и есть, т.е. такая цифра сохранена?

 
Kadet:

Уже делал. Спасибо. Проверял. Идёт до 8-го знака. дальше не показывает, ибо процедура DoubleToStr() позволяет печатать double только до 8-го знака.

//+------------------------------------------------------------------+
//| up to 16 digits after decimal point                              |
//+------------------------------------------------------------------+
string DoubleToStrMorePrecision(double number,int precision)
  {
   double rem,integer,integer2;
   double DecimalArray[17]={ 1.0, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0,  10000000.0, 100000000.0,
                             1000000000.0, 10000000000.0, 100000000000.0, 10000000000000.0, 100000000000000.0,
                             1000000000000000.0, 1000000000000000.0, 10000000000000000.0 };
   string intstring,remstring,retstring;
   bool   isnegative=false;
   int    rem2;
//----
   if(precision<0)  precision=0;
   if(precision>16) precision=16;
//----
   double p=DecimalArray[precision];
   if(number<0.0) { isnegative=true; number=-number; }
   integer=MathFloor(number);
   rem=MathRound((number-integer)*p);
   remstring="";
   for(int i=0; i<precision; i++)
     {
      integer2=MathFloor(rem/10);
      rem2=NormalizeDouble(rem-integer2*10,0);
      remstring=rem2+remstring;
      rem=integer2;
     }
//----
   intstring=DoubleToStr(integer,0);
   if(isnegative) retstring="-"+intstring;
   else           retstring=intstring;
   if(precision>0) retstring=retstring+"."+remstring;
   return(retstring);
  }