Преобразования double

 

Господа!

Тупой, конечно вопрос, однако же никак не могу врубиться.

Мне нужно установить константы:

#define MachineEpsilon  5E-16;
#define MaxRealNumber  1E+300;
#define MinRealNumber  1E-300;

double BigNumber = 1E+70;
double SmallNumber = 1E-70;

Выдаёт ошибку. "Ругается" на запись "5E", "1E" и т.п. Пытаюсь так - "5е-16", "1е+300"... Результат то же.

Пытаюсь решить кардинально:

double MachineEpsilon  = MathPow(5.00,-16);
double MaxRealNumber   = MathPow(1.00,300);
double MinRealNumber   = MathPow(1.00,-300);

Печатаю результат. Выдаёт:

MachineEpsilon  = 0.00
MaxRealNumber   = 1.00
MinRealNumber   = 1.00

Не могу врубиться в чём "собака порылась". Вроде записи типа "5Е+16" - любой программой воспринимается правильно, а тут...

Плюсь к тому же уже не первый раз сталкиваюсь с проблемой, когда присваивая к типу double чего-нибудь, в особенности если в правой части выражения идут int - выдаёт так же целое, даже если идёт деление, где явно - с плавающей, а выдаёт всё равно - целое.

double z = 5 / 2;

// выдаёт целое

z = 2.00;

А явного преобразования из int в double на MQL-4 нет.

Как выходить из подобных ситуаций?

 
Kadet:

Пытаюсь решить кардинально:

double MachineEpsilon  = MathPow(5.00,-16);
double MaxRealNumber   = MathPow(1.00,300);
double MinRealNumber   = MathPow(1.00,-300);

Печатаю результат. Выдаёт:

MachineEpsilon  = 0.00
MaxRealNumber   = 1.00
MinRealNumber   = 1.00

Извиняюсь за любопытство, а какой результат вы ожидали от возведения единицы в любую степень? А на пятерку похоже разрядности уже не хватает, т.е. ноль в сухом остатке. Всё правильно.


Kadet:
double z = 5 / 2;

// выдаёт целое

z = 2.00;

А явного преобразования из int в double на MQL-4 нет.

Как выходить из подобных ситуаций?

(Трибуны радостно скандируют) Поиск! Поиск! Поиск!

За такие вопросы, по-моему, пора уже банить на форуме. Это просто свинство.

 
timbo
timbo:
Kadet:

Пытаюсь решить кардинально:

double MachineEpsilon  = MathPow(5.00,-16);
double MaxRealNumber   = MathPow(1.00,300);
double MinRealNumber   = MathPow(1.00,-300);

Печатаю результат. Выдаёт:

MachineEpsilon  = 0.00
MaxRealNumber   = 1.00
MinRealNumber   = 1.00

Извиняюсь за любопытство, а какой результат вы ожидали от возведения единицы в любую степень? А на пятерку похоже разрядности уже не хватает, т.е. ноль в сухом остатке. Всё правильно.


Kadet:
double z = 5 / 2;

// выдаёт целое

z = 2.00;

А явного преобразования из int в double на MQL-4 нет.

Как выходить из подобных ситуаций?

(Трибуны радостно скандируют) Поиск! Поиск! Поиск!

За такие вопросы, по-моему, пора уже банить на форуме. Это просто свинство.



писал (а):

Kadet:

Пытаюсь решить кардинально:

double MachineEpsilon  = MathPow(5.00,-16);
double MaxRealNumber   = MathPow(1.00,300);
double MinRealNumber   = MathPow(1.00,-300);

Печатаю результат. Выдаёт:

MachineEpsilon  = 0.00
MaxRealNumber   = 1.00
MinRealNumber   = 1.00

Извиняюсь за любопытство, а какой результат вы ожидали от возведения единицы в любую степень? А на пятерку похоже разрядности уже не хватает, т.е. ноль в сухом остатке. Всё правильно.

Это точно... Ступил, согласен... Просто уже башка кипит. А как же тогда реализовать "1E-300" ? Может так - "0.000000...001;". :) Видимо не иначе.

А насчёт поиска - От чё нашёл:

"Константы с плавающей точкой состоят из целой части, точки (.) и дробной части. Целая и дробная части представляют собой последовательности десятичных цифр.

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

Попробовал представление - "1*e-300" - не получается.

Поискал поиском... Вот что нашёл:

В выражениях языка MQL4 используется только неявное приведение типов. Приоритет типов при преобразовании в порядке возрастания:

int  (bool,color,datetime);
double;
string;

Перед выполнением операций (кроме операций присваивания) происходит преобразование в тип, имеющий наибольший приоритет, а перед операциями присваивания - в целевой тип.

Примеры:

int    i = 1 / 2;     // приведения типов нет, результат: 0
int    i = 1 / 2.0;   // выражение приводится к типу double, затем приводится к целевому типу int, результат: 0
double d = 1.0 / 2.0; // приведения типов нет, результат: 0.5
double d = 1 / 2.0;   // выражение приводится к типу double, который совпадает с целевым типом, результат: 0.5
double d = 1 / 2;     // выражение типа int приводится к целевому типу double, результат: 0.0
string s = 1.0 / 8;   // выражение приводится к типу double, затем приводится к целевому типу string, результат: "0.12500000" (строка, содержащая 10 символов)
string s = NULL;      // константа типа int приводится к целевому типу string, результат: "0" (строка, содержащая один символ)
string s = "Ticket #"+12345; // выражение приводится к типу string, который совпадает с целевым типом, результат: "Ticket #12345"

Приведение типов применяется не только к константам, но и переменным разных типов."


Ну и за какие провинности меня банить? Лучше на вопрос ответте, если знаете.

 
Есть такая функция NormalizeDouble ...
 

int=doble

все что после запятой просто теряется. Так было всегда, арифметику: процессора не утяжеляют. Сохраняют очень ценное Быстродействие процессора.
Такое приведение называется "усечение дробной части".

/*поэтому*/ int a=1/2; //а=0<.5> =0


Арифметически правильное приведение double к int это отдельная ресурсозатратная функция NormalizeDouble()

int a=NormalizeDouble(1/2,0) //a=<0.5>=1

т.к. результат >=0.5 то по бухгалметрским правилам округляется до единицы.


Соотвественно int a=NormalizeDouble(1000000/2000001,0) //a=<0.49999> =0


P.S.

to kharko

Извините, что влез, пока постил не видел, что Вы ответили.

 
kharko:
Есть такая функция NormalizeDouble ...

Бесполезно.

double z  = NormalizeDouble(1/2,10);

Print ("z = ", z);

/*******

z = 0
z = 0
...
z = 0

Во... Нашёл форму:

double z  = NormalizeDouble(1,10)/NormalizeDouble(2,10);
/***************
z = 0.5

О, заморочки, балин... :))) Т.е. каждое слагаемое, числитель, знаминатель и пр. нужно нормализовывать персонально.

Korey:

int=doble

...

Та то всё понятно, только я ж не из double в int, а из int в double перевожу. С int как раз всё понятно. Просто отбрасывает 4 байта поле запятой и всё (это по простому)...

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

 
double z  = 1.0/2.0;
 
Вопрос автора ветки стал еще более непонятен, Поясните пожалуйста.
 
Kadet:

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

MathPow(0.1,300);
 
Kadet:

Ну и за какие провинности меня банить? Лучше на вопрос ответте, если знаете.

По форуму сделай поиск, не ограничивайся первыми двумя строчками. Этот вопрос отвечался сотни раз. За это и банить, что ты в сто первый раз спрашиваешь.

Иван Грозный убил своего сына за то, что тот тупо задавал вопросы, а не пользовался поиском.

 
Kadet:

О, заморочки, балин... :))) Т.е. каждое слагаемое, числитель, знаминатель и пр. нужно нормализовывать персонально.

Нет, просто надо следить за тем что считаете. Если надо при целочисленном делении получить дабл, укажите это явно:

int x = 5;
int y = 2;
double z = 1.0*x/y;
Причина обращения: