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

 
Kadet:

М-да...

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

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

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

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

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

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

Попробуйте еще раз прочитать, что я Вам писал о количестве значащих в мантиссе числа. Там (после 15 значащей) может быть все что угодно - это за пределами восприятия МКЛ. И еще: есть некоторая неточность - дело в том, что выпечатываться число может не совсем в том виде, в котором хранится. Это явно видно если пользоваться средствами отладки на С\С++ и 

параллельно печатать значения. Поскольку в МКЛ отладчика нет (надеюсь пока) то проверить это так просто, увы, не удастся. Разве, что печать сообщения если разница ненулевая. Попробуйте проверить так....


Успехов.

 
VladislavVG писал (а):

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


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

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

Харашо... :))) Пашёл учить мат.часть... :) Хотя я каца упоминал, что даблы и инты в MQL поменьше будут, да и глубочайши тонкости "в скольких байтах в С++ хранится лонг дабл" мне впоследнее время кок-то без надобности были. Склирозь. Позабыл всё о низкоуровневых-то... Ну да ладно.


Korey:

to Kadet

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

Да она мне пока не сильно и нужна-то. Понадобится - тогда и буду череп ломать. :)))


Вот интересно, если MQL сделан на основе С++, у которого одной из сильнейших сторон является объектно-ориентированное программирование, почему же тогда в MQL не впихнули структуры? Они же сейчас так или инече реализованы почти на всех языках, и всё это пошло, по-моему, именно из С++?

А теперь сиди и думай как многотипную структуру вогнать в однотипный массив... :)))

 
Kadet:

Вот интересно, если MQL сделан на основе С++, у которого одной из сильнейших сторон является объектно-ориентированное программирование, почему же тогда в MQL не впихнули структуры? Они же сейчас так или инече реализованы почти на всех языках, и всё это пошло, по-моему, именно из С++?

А теперь сиди и думай как многотипную структуру вогнать в однотипный массив... :)))

Сдается мне, если Вы использовали экспоненциальный формат, то пользовались либо С, либо Делфи.

Если Вы программируете на С\С++ (Делфи), пишите там и линкуйте длл-ки. МКЛ это позволяет. А в МКЛ возвращайте результаты расчетов - дабл вполне подойдет. Думаю - это самый лучший выход. К тому же получите платформонезависимый код. Там особых сложностей нет. Хоть мне в свое время для этого пришлось перейти на MS Studio.

Просто из примера можно создать проект и модифицировать потом как душе угодно. Чтобы МТ4 понимал в С\С++ нужно проект делать с .def файлом, в котором перечислены все экспортируемые функции. (Как для Делфи не подскажу, но тоже есть пример).


Успехов.

 

 
Kadet:

Вот интересно, если MQL сделан на основе С++, у которого одной из сильнейших сторон является объектно-ориентированное программирование, почему же тогда в MQL не впихнули структуры? Они же сейчас так или инече реализованы почти на всех языках, и всё это пошло, по-моему, именно из С++?

'Интервью со Станиславом Стариковым: особенности нового MQL5'

Ждем-с) Действительно не хватает.

 
VladislavVG:

Попробуйте еще раз прочитать, что я Вам писал о количестве значащих в мантиссе числа. Там (после 15 значащей) может быть все что угодно - это за пределами восприятия МКЛ.

И еще: есть некоторая неточность - дело в том, что выпечатываться число может не совсем в том виде, в котором хранится.

Так в том-то и дело, что "после 15-го может быть всё что угодно"... Вот сижу и думаю - там то что "угодно" мне или машине?... :)))) Хотя страная ситуация... Почему тогда разработчики позиционируют пределы - "1,7*е +\-308", если их использовать нет возможности...? Неонятно?


VladislavVG:

Это явно видно если пользоваться средствами отладки на С\С++ и

параллельно печатать значения. Поскольку в МКЛ отладчика нет (надеюсь пока) то проверить это так просто, увы, не удастся. Разве, что печать сообщения если разница ненулевая. Попробуйте проверить так....

Да, конечно жаль, что нет отладчика. А нулевое/ненулевое я проверил, но так ведь можно проверить только "1е-n", а "1е-n".

Неутешительно. "1е-300" и "1е+300" - воспринимает как ноль...

Жаль. Придётся голову сломать, как это представить или по другому ограничить пределы чисел...

 
Kadet:
VladislavVG:

Попробуйте еще раз прочитать, что я Вам писал о количестве значащих в мантиссе числа. Там (после 15 значащей) может быть все что угодно - это за пределами восприятия МКЛ.

И еще: есть некоторая неточность - дело в том, что выпечатываться число может не совсем в том виде, в котором хранится.

Так в том-то и дело, что "после 15-го может быть всё что угодно"... Вот сижу и думаю - там то что "угодно" мне или машине?... :)))) Хотя страная ситуация... Почему тогда разработчики позиционируют пределы - "1,7*е +\-308", если их использовать нет возможности...? Неонятно?


VladislavVG:

Это явно видно если пользоваться средствами отладки на С\С++ и

параллельно печатать значения. Поскольку в МКЛ отладчика нет (надеюсь пока) то проверить это так просто, увы, не удастся. Разве, что печать сообщения если разница ненулевая. Попробуйте проверить так....

Да, конечно жаль, что нет отладчика. А нулевое/ненулевое я проверил, но так ведь можно проверить только "1е-n", а "1е-n".

Неутешительно. "1е-300" и "1е+300" - воспринимает как ноль...

Жаль. Придётся голову сломать, как это представить или по другому ограничить пределы чисел...

К сожалению угодно машине, а не программеру. :(.

По поводу диапазона +\- 308 и размера мантиссы - если программист будет оперировать величинами, отличающимися не более, чем на 15 значащих цифр (читайте не более чем на 15 порядков), то для любых чисел из диапазона будет получен корректный результат по любой из допустимых операций. Если величины будут отличаться более, чем на 15 порядков, то одна из них будет принята равной нулю. Собственно, в большинстве методов такой разницей можно пренебречь. А загнать в диапазон можно процедурой нормировки.


Успехов.

 
VladislavVG:

Сдается мне, если Вы использовали экспоненциальный формат, то пользовались либо С, либо Делфи.

Если Вы программируете на С\С++ (Делфи), пишите там и линкуйте длл-ки. МКЛ это позволяет. А в МКЛ возвращайте результаты расчетов - дабл вполне подойдет. Думаю - это самый лучший выход. К тому же получите платформонезависимый код. Там особых сложностей нет. Хоть мне в свое время для этого пришлось перейти на MS Studio.

Просто из примера можно создать проект и модифицировать потом как душе угодно. Чтобы МТ4 понимал в С\С++ нужно проект делать с .def файлом, в котором перечислены все экспортируемые функции. (Как для Делфи не подскажу, но тоже есть пример).

:))) Вы чертовски проницательны... Дык и в Паскале, и даже в одном из самых прямолинейных Бейсике структуры как "Public Type" реализованы... А тут нет.

Я уже думал над DLL-ками... Видимо так и сделаю... Просто хотелось бы MQL получше узнать, вот и столкнулся с...

Ну да ладно.

 

Не удержался.

Половине ораторов, в том числе и топикстартеру, срочно учить матчасть. Прежде всего, нужно уяснить, чем отличается разрядность от кол-ва значащих цифр? Ну и после этого прийти к выводу, что стандартной ф-ии, которая напечатает 1е-300  - нет. А возможность работы  с такими числами проверить очень просто (сам не проверял, но уверен, что работает):

double x = MathPow(0.1, -200);  
double y = MathPow(0.1, -198);  
if (NormalizeDouble(x/y, 0) == 100.0) Print("Ура!"); else Print("Топикстартер прав!");

P. S. А все говорят - поиск. К чему поиск, если половина участников не понимает того, о чём пишет

 

komposter, спасибо!
Полезная процедура. При необходисоти воспользуюсь.

Проверил возможности MQL на точность представления (видимо и хранения) цифр i-го порядка через for.

int start() {
     double x = 0, y = 0;
     for ( int i = 1; i <= 300; i++ ) {
     x = MathPow(0.1,i);
     y = MathPow(10.0,i);
     if(x != 0) Print("i = ", i, "; x = ", x);
     if(y != 0) Print("i = ", i, "; y = ", y);
     }
  return(0);
}

Выдало вот такую интересную картинку:

i = 1 x = 0.1

i = 1 y = 10

i = 2 x = 0.01

i = 2 y = 100

...

i = 23 x = 0

i = 23 y = 100000000000000010000000

i = 24 x = 0

i = 24 y = 999999999999999980000000

i = 25 x = 0

i = 25 y = 10000000000000001000000000

i = 26 x = 0

i = 26 y = 100000000000000000000000000

i = 27 x = 0

i = 27 y = 1000000000000000000000000000

i = 28 x = 0

i = 28 y = 9999999999999999600000000000

...

i = 72 x = 0

i = 72 y = 999999999999999940000000000000000000000000000000000000000000000000000000

i = 73 x = 0

В общем до 23-го порядка - вроде все нормально. А уж после - "как Бог на душу положит".

х=1е-i - печатается до последнего - 299-го порядка, т.е. он до последнего больше нуля. Но что там внутни, после запятой... ???

В общем - "бой в Крыму, всё в дыму...". :)))

 
Kadet безнадёжен...
Причина обращения: