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

 
notused:
Kadet безнадёжен...

:))) Ну, дык скажите мне одно, Ваше Величество... :)))

Как мне цихирю "1е+\-300" присвоить константе? Типа:

#define Oba-na   1e+300
#define Oba-2na  1e-300

Уж не обессутте, снизойдите до нас, невежд...;)))

Откройте мне глаза... ;)))

 
Kadet:

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

Вот вот, расскажите как с помощью DLL задать 1E-300,
с Ассемблера начать - можно.

 
notused:

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

Половине ораторов, в том числе и топикстартеру, срочно учить матчасть. Прежде всего, нужно уяснить, чем отличается разрядность от кол-ва значащих цифр? Ну и после этого прийти к выводу, что стандартной ф-ии, которая напечатает 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. А все говорят - поиск. К чему поиск, если половина участников не понимает того, о чём пишет

Ваш Вариант будет работать. Хоть по отдельности числа смысла не имеют - если проверять каждое в отдельности принтом получим нули (это предположительно - у меня под линуксом терминал падает при попытке распечатать принтом значения  :) ). Но оба попадают в диапазон и различаются менее чем размерность мантиссы.

Теперь контрольный выстрел ;) :


double dp=50, bp=-200;

double x = MathPow(0.1, bp );
double y = MathPow(0.1, bp+dp);
double z = MathPow( 10, dp );

double d = NormalizeDouble(x/y, 0);

//Print("x = ",x);
//Print("y = ",y);

//Print("z = ",z);

if ( d == z) Print(" URA !"); else Print("ERROR !");


Будет выдавать URA ! при вашем значении dp=2, будет выдавать URA ! и при dp=10, а вот при текущем будет выдавать  ERROR !  - разница более чем количество значащих. 

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


Успехов.

 
Korey:

Вот вот, расскажите как с помощью DLL задать 1E-300,
с Ассемблера начать - можно.

А что, для того, чтобы в MQL задать обычное число нужно DLL-ку писать...

Да проще в С++ весь модуль написать и уже его в DLL-ку скомпеливросать, причём программулина-то на С уже написана...

 
VladislavVG:

Ваш Вариант будет работать. Хоть по отдельности числа смысла не имеют...

Угу! Немного не успел, Вы меня опередили.

"Всё, что угодно" - оно же ведь тоже не просто так. Оно ведь тоже подчиняются общим правилам х=MathPow(0.1,i). Хоть сами числа х=MathPow(0.1,i) и y=MathPow(0.1,(i-2)) по отдельности и не будут иметь ожидаемые значения, но при таком раскладе, (1е+i)/(1e+(i-2)), соотношение между ними (=100) всё равно будет всегда сохраняться.

 
Kadet:
Korey:

Вот вот, расскажите как с помощью DLL задать 1E-300,
с Ассемблера начать - можно.

А что, для того, чтобы в MQL задать обычное число нужно DLL-ку писать...

Да проще в С++ весь модуль написать и уже его в DLL-ку скомпеливросать, причём программулина-то на С уже написана...

Ну так осваивайте MQL, еще не такое увидите)))

 
VladislavVG:


Будет выдавать URA ! при вашем значении dp=2, будет выдавать URA ! и при dp=10, а вот при текущем будет выдавать  ERROR !  - разница более чем количество значащих. 

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


Собственно, своим постом хотел показать, что с чрезвычайно мелкими числами (как и с чрезвычайно большими) вполне можно работать. Но у Вас всё-равно нет полного понимания - сравнивать что-то нужно используя требуюмую точность. В Вашем случае можно писать: if ( d - z < MathPow(10, dp / 2)) Print(" URA !"); else Print("ERROR !"); и всё работает.


Kadet:

Как мне цихирю "1е+\-300" присвоить константе? Типа:

#define Oba-na   1e+300
#define Oba-2na  1e-300

Уж не обессутте, снизойдите до нас, невежд...;)))

Откройте мне глаза... ;)))

Никак. Только отдельные переменные, в init инициализированные (а какая разница, раз константы?). В общем, без таких констант можно обойтись

 
notused:

Собственно, своим постом хотел показать, что с чрезвычайно мелкими числами (как и с чрезвычайно большими) вполне можно работать. Но у Вас всё-равно нет полного понимания - сравнивать что-то нужно используя требуюмую точность. В Вашем случае можно писать: if ( d - z < MathPow(10, dp / 2)) Print(" URA !"); else Print("ERROR !"); и всё работает.



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

По поводу правильного сравнения чисел с плавающей точкой не поленитесь порыться в соотвествующих ветках - я там писал. Потом будете рассказывать ;). В данной ветке речь шла не об этом.


Успехов.

 
VladislavVG:
notused писал (а):

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

По поводу правильного сравнения чисел с плавающей точкой не поленитесь порыться в соотвествующих ветках - я там писал. Потом будете рассказывать ;). 

В данной ветке речь шла не об этом.


Успехов.

Когда человек сомневается - это хорошо. Когда он сомневается по поводу других - это плохо. Побеждает самый крикливый. За сим раскланяюсь. Всем успехов.

 
notused:
VladislavVG:
notused писал (а):


Когда человек сомневается - это хорошо. Когда он сомневается по поводу других - это плохо.

ИМХО - Еще хуже, когда человек не сомневается в некомпетентности других и сходу развешивает ярлыки, даже не удосужившись сделать попытку вникнуть в тему обсуждения.


Вам также успехов.