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

 
rsi:
double z  = 1.0/2.0;

А если не обычные цифры 1.0 или 2.0, а некие int x, y, x...

komposter:
Kadet:

А вот, что делать с "1Е-300"? Можно это число как-то в программу загнать не описывая по тупому - "0.000...001"?

MathPow(0.1,300);

Интересное предложение... Но тоже заморочка... :)))

Попробовал и выдаёт "0"... Не понятно, то ли такое маленькое число получается, что представляет как ноль, то ли опять какой-то глюк...

По этой же схеме попробовал:

MathPow(10.0,300);

Выдало: 100000000000000010000000000... 000.0

Не понятно откуда взялась ещё одна единица в середине....?

Korey:
Вопрос автора ветки стал еще более непонятен, Поясните пожалуйста.

Вопрос в том, как по простому из INT сделать DOUBLE и как представлять в коде программе числа типа "1Е+300".

Вроде простая задача, а на деле оказалось...

 

Кстати вот нашёл такой вариант:

double x  = NormalizeDouble(1,10)/2;
Тоже нормально работает. Т.е. достаточно привести к double только числитель.
 
1. Гоняю числа в GlobalVariables() туда сюда, а также StrToDouble/DoubleTo Str() и никаких проблем с инт=double
так как интелловские математики заранее сделали число значащих цифр double больше чем инт.
2.пентиумный машинный порядок у нас где то +256/-255, а то и +128/-127. Т.е. 300 ну никак .
 
Kadet:

А если не обычные цифры 1.0 или 2.0, а некие int x, y, x...

Читайте ответы не через один, а подряд.

Kadet писал (а):
MathPow(0.1,300);
Интересное предложение... Но тоже заморочка... :)))
Попробовал и выдаёт "0"... Не понятно, то ли такое маленькое число получается, что представляет как ноль, то ли опять какой-то глюк...

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

//-----------------------------------------------------------------------------------------

2.пентиумный машинный порядок у нас где то +256/-255, а то и +128/-127. Т.е. 300 ну никак .

//-----------------------------------------------------------------------------------------

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


С каких пор точность представления данных зависит от размерности шины данных, а не от типа ? (Это так - можно не отвечать ;) ).


2 Kadet А Вы вообще понимаете чего хотите добиться ?. По секрету - диапазон double в С\С++ : 10 в степени +\- 384 размерность мантиссы  15 значащих цифр. То есть, не зависимо от порядка в 16 знаке мантиссы (это то, что после запятой - прочтите формат хранения чисел типа плавающей точки с двойной точностью) может быть ошибка. В С\С++ есть модификаторы long (в МКЛ отсутствуют)  можно добиться 32 (long doube) значащих цифр в мантиссе и увеличение диапазона - точно не помню до каких порядков, а в стандарт лезть лень.

Почитали б че-нить по программированию. А заодно и стандарт С\С++ - там есть ответы на многие неосвещенные в МКЛ вопросы.


Успехов.

 
Korey:
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". Не понимает подобной записи, хотя любые дрегие программы любого компа - свободно их расшифровывают.

Далее... при описании переменных и констант вначале самой программы - нельзя использовать функции. Т.е. почему-то я не могу описать сразу:

double BigNumber = MathPow(10.0,70);

Приходится выкручиваться:

double BigNumber = 0;
BigNumber = MathPow(10.0,70);

Так воспринимает. Т.е. почему-то не даёт одновременно и описать переменную и задать её значение через функцию (я правда все функции не проверял, но на некоторые ругается). Хотя в описании языка такая возможность допускается.

А уж о том, чтобы задать константу скажем значением - 1е-300:

#define MaxRealNumber   1*e+300

... и думать не приходится.

 
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".
 
Kadet:
Korey:

... и думать не приходится.


Ага, понятно. Дело в том, что экспоненциальный формат в МКЛ не позволяется и вызов функции вне тела функции не допускается.

Когда-то для вычисления машинной точности, позволенной для данного типа данных я использовал цикл деления. Нечто такое

double eps=0.1;

while((1+eps)>1) eps/=10;

По окончанию цикла в переменной eps машинная точность. Оформите  функцией и вызывайте один раз.

Проверка порядка используемых чисел не так тривиальна. Может поискать обходные пути ?


ЗЫ Вот видите диапазон даблов в МКЛ меньше, чем в С\С++.

ЗЗЫ

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

Следовательно переменная 1Е-300 в МКЛ смысла не имеет, поскольку МКЛ не отличает уже с уровня 1Е-16. То есть, что 2Е-16, что 8Е-16 уже будут за гранью точности и будут считаться нулем.


Успехов.

 
VladislavVG:

2 Kadet А Вы вообще понимаете чего хотите добиться ?. По секрету - диапазон double в С\С++ : 10 в степени +\- 384 размерность мантиссы 15 значащих цифр. То есть, не зависимо от порядка в 16 знаке мантиссы (это то, что после запятой - прочтите формат хранения чисел типа плавающей точки с двойной точностью) может быть ошибка. В С\С++ есть модификаторы long (в МКЛ отсутствуют) можно добиться 32 (long doube) значащих цифр в мантиссе.

Почитали б че-нить по программированию. А заодно и стандарт С\С++ - там есть ответы на многие неосвещенные в МКЛ вопросы.


Успехов.




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

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

Тип данных:
Размер в байтах:
Численный разброс:
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 (Почему-то несколько битов не исполюзуются).

Размер мантисы в MQL-4 - double - 10 в степени +\-308, т.е. используется двоичная мантиса = 53 бита.

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


Ладно. Шас не об этом. Вопрос то простой: как задать констинту со значением - 1е+\-300 в MQL-4?

 

Print() печатает значения размерностью по уmолчанию = Digit после запятой!!!!!

Иначе используйте DoubleToStr()
MQL-4 это малогабаритный торговый язык, былые удобства здесь вспоминать только нервы портить.

Причина обращения: