Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
А если не обычные цифры 1.0 или 2.0, а некие int x, y, x...
А вот, что делать с "1Е-300"? Можно это число как-то в программу загнать не описывая по тупому - "0.000...001"?
Интересное предложение... Но тоже заморочка... :)))
Попробовал и выдаёт "0"... Не понятно, то ли такое маленькое число получается, что представляет как ноль, то ли опять какой-то глюк...
По этой же схеме попробовал:
Выдало: 100000000000000010000000000... 000.0
Не понятно откуда взялась ещё одна единица в середине....?
Вопрос автора ветки стал еще более непонятен, Поясните пожалуйста.
Вопрос в том, как по простому из INT сделать DOUBLE и как представлять в коде программе числа типа "1Е+300".
Вроде простая задача, а на деле оказалось...
Кстати вот нашёл такой вариант:
Тоже нормально работает. Т.е. достаточно привести к double только числитель.так как интелловские математики заранее сделали число значащих цифр double больше чем инт.
2.пентиумный машинный порядок у нас где то +256/-255, а то и +128/-127. Т.е. 300 ну никак .
А если не обычные цифры 1.0 или 2.0, а некие int x, y, x...
Kadet писал (а):
MathPow(0.1,300);
Интересное предложение... Но тоже заморочка... :)))
Попробовал и выдаёт "0"... Не понятно, то ли такое маленькое число получается, что представляет как ноль, то ли опять какой-то глюк...
//-----------------------------------------------------------------------------------------
2.пентиумный машинный порядок у нас где то +256/-255, а то и +128/-127. Т.е. 300 ну никак .
//-----------------------------------------------------------------------------------------
??????????????????????????
С каких пор точность представления данных зависит от размерности шины данных, а не от типа ? (Это так - можно не отвечать ;) ).
2 Kadet А Вы вообще понимаете чего хотите добиться ?. По секрету - диапазон double в С\С++ : 10 в степени +\- 384 размерность мантиссы 15 значащих цифр. То есть, не зависимо от порядка в 16 знаке мантиссы (это то, что после запятой - прочтите формат хранения чисел типа плавающей точки с двойной точностью) может быть ошибка. В С\С++ есть модификаторы long (в МКЛ отсутствуют) можно добиться 32 (long doube) значащих цифр в мантиссе и увеличение диапазона - точно не помню до каких порядков, а в стандарт лезть лень.
Почитали б че-нить по программированию. А заодно и стандарт С\С++ - там есть ответы на многие неосвещенные в МКЛ вопросы.
Успехов.
1. Гоняю числа в GlobalVariables() туда сюда, а также StrToDouble/DoubleTo Str() и никаких проблем с инт=double
так как интелловские математики заранее сделали число значащих цифр double больше чем инт.
2.пентиумный машинный порядок у нас где то +256/-255, а то и +128/-127. Т.е. 300 ну никак .
"+256/-255, а то и +128/-127" - нет, ну то понятно... Но это же величина 2-х и 1-го байта соответственно. А в int - их, байтов - 4, а в double - 8байтов.
Так что возможность должна быть. К тому же в описании типов MQL-4 - конкретно написано:
Внутреннее представление - число двойной точности размером 8 байт. Пределы изменения от -1.7 * e-308 до 1.7 * e308. Точность обеспечивается не более, чем 15 значащими цифрами."
Т.е. возможность должна быть.
Попробую сформулировать свой вопрос по другому.
Мне нужно установить вначале программы неволько констант и переменных с такими вот значениями. Это границы возможных используемых чисел устанавливаю, а то программа такая, что запросто может за них вылететь, а это не желательно. Но компилятор ругается. Не понимает от ни "1Е+300", ни "1е+300", ни "1*Е+300", ни "1*е+300". Не понимает подобной записи, хотя любые дрегие программы любого компа - свободно их расшифровывают.
Далее... при описании переменных и констант вначале самой программы - нельзя использовать функции. Т.е. почему-то я не могу описать сразу:
Приходится выкручиваться:
Так воспринимает. Т.е. почему-то не даёт одновременно и описать переменную и задать её значение через функцию (я правда все функции не проверял, но на некоторые ругается). Хотя в описании языка такая возможность допускается.
А уж о том, чтобы задать константу скажем значением - 1е-300:
... и думать не приходится.
А проверить самому лень?
Проверил... :)))) - результат - 0, 0, 0, 0,...., 0, 0.
Видимо всё же - 0, т.е. не перевело в double, а оставило в int - т.е. - 0.
Даже:
Не помогло. Всё одно - "0".... и думать не приходится.
Ага, понятно. Дело в том, что экспоненциальный формат в МКЛ не позволяется и вызов функции вне тела функции не допускается.
Когда-то для вычисления машинной точности, позволенной для данного типа данных я использовал цикл деления. Нечто такое
double eps=0.1;
while((1+eps)>1) eps/=10;
По окончанию цикла в переменной eps машинная точность. Оформите функцией и вызывайте один раз.
Проверка порядка используемых чисел не так тривиальна. Может поискать обходные пути ?
ЗЫ Вот видите диапазон даблов в МКЛ меньше, чем в С\С++.
ЗЗЫ
И еще: переменные типа дабл не хранятся так, как инт - то есть хранятся не побайтно. Отдельно хранится мантисса - значащие после запятой, и порядок. Это верно для для С\С++. Поскольку сам МКЛ написан на С и разработчики рекомендовали в свое время по всем неосвещенным или малопонятным вопросам обращаться к стандарту этого языка - исхожу из того, что это верно и для МКЛ :).
Следовательно переменная 1Е-300 в МКЛ смысла не имеет, поскольку МКЛ не отличает уже с уровня 1Е-16. То есть, что 2Е-16, что 8Е-16 уже будут за гранью точности и будут считаться нулем.
Успехов.
2 Kadet А Вы вообще понимаете чего хотите добиться ?. По секрету - диапазон double в С\С++ : 10 в степени +\- 384 размерность мантиссы 15 значащих цифр. То есть, не зависимо от порядка в 16 знаке мантиссы (это то, что после запятой - прочтите формат хранения чисел типа плавающей точки с двойной точностью) может быть ошибка. В С\С++ есть модификаторы long (в МКЛ отсутствуют) можно добиться 32 (long doube) значащих цифр в мантиссе.
Почитали б че-нить по программированию. А заодно и стандарт С\С++ - там есть ответы на многие неосвещенные в МКЛ вопросы.
Успехов.
Вы, наверное здесь самый умный (уж извините за резкость):
Размер мантисы в C++: - double - 10 в степени +\-384,
В MQL-4 тип int почти соответствует С-шному - long int, a double - почти соответствует long double (Почему-то несколько битов не исполюзуются).
Размер мантисы в MQL-4 - double - 10 в степени +\-308, т.е. используется двоичная мантиса = 53 бита.
Что Вам ещё по программированию рассказать? Может ещё Assembler поразбираем?
Ладно. Шас не об этом. Вопрос то простой: как задать констинту со значением - 1е+\-300 в MQL-4?
Print() печатает значения размерностью по уmолчанию = Digit после запятой!!!!!
Иначе используйте DoubleToStr()
MQL-4 это малогабаритный торговый язык, былые удобства здесь вспоминать только нервы портить.