Правила приведения типов или представление действительных чисел - как понять? - страница 6

 
VladislavVG:

Потому, что число 0.0007 не может быть точно представлено двоичным кодом. Получается 0.000699999999999. При приведении типов от дабл к инт дробная часть просто отбрасывается. Потому и получается 6.

При нормализации разности Вы получите что-то типа 0.0007000000000001. Дальше аналогично.

При округлении обычно работает правило +0.5 и отбрасывание дробной части - потому тоже получается 7.


Спасибо. Терь всё понятно.

Если кому нужно - не каждую дробную часть десятичного числа можно представить точно двоичной дробью.

Т.е. в двоичной системе сдвиг влево - умножение на 2, сдвиг в право - деление на 2.

дробная часть в десятичной системе выглядет так (1/2+1/4+1/8+1/16+1/32+...) по разрядам соответственно.

(именно их и можно представить точно - 0,5; 0,25; 0,125 и тд. ).

1 вариант.

int start()
{
int delta;

delta=(1.0548-1.0541)/Point;


Comment(delta);
return(0);

}

Результат: delta = 6, а внутренне 6.9999999999999999...

(Т.е. при переводе числа 0.0007 из десяточной в двоичную - 0.0000000000101101111000000000110100011011011100010111010110001110, и обратно - 0.00069999999999999999 ),

Если взять другой вариант с 0.00007 то он будет работать без нормализации и прочего...

int start()
{
int delta;

Point=0.0001;

delta=(1.10588-1.10581)/Point*10;

Comment(delta);
return(0);
}


Результат: delta =7, а внутренне 0.00007000000000000001.

 
VladislavVG:

Это следствие архитектуры компьютера и не связано с языком программирования или операционной системой. Единственный класс десятичных дробей, который точно представим - это те, что состоят из 0 и 1. Типа 0.001111000011111 в любой последовательности.

Не мне вас учить, но на скока я прошарил эту тему то можнно тока 0,5; 0,25; 0,125 и тд.

Как можно представить одну десятую(сотую, тысячную....) часть единицы - одной второй(четвертой, восьмой, шестнадцатой....)? с учетом 64 разрядов (8байт) конечно, а не бесконечночти...


Пример - 0,1 (десятичн.) -в двоичную 0.0001100110011001100110011001100110011001100110011001101000000000, обратно

0.10000000000000000555.

При уменьшении разрядов соответственно погрешность будет только расти...

 
jeronimo:

Не мне вас учить, но на скока я прошарил эту тему то можнно тока 0,5; 0,25; 0,125 и тд.

Как можно представить одну десятую(сотую, тысячную....) часть единицы - одной второй(четвертой, восьмой, шестнадцатой....)? с учетом 64 разрядов (8байт) конечно, а не бесконечночти...


Пример - 0,1 (десятичн.) -в двоичную 0.0001100110011001100110011001100110011001100110011001101000000000, обратно

0.10000000000000000555.

При уменьшении разрядов соответственно погрешность будет только расти...


Да, Вы правы - это я несколько погорячился с ответом.
 

И ещё такой вопрос - у меня почему то действительные числа более 4 знаков (после запятой) типа 1.554878, окргуляются до 4 знака. Т.е. будет 1.5549.

пример

int start()
  {
  double  delta;
   
   delta=1.10588;
      
   Comment(delta);
   return(0);
  }

Выдает: 1.1059.

У кого-нибудь такое было?

ЗЫ пробовал и с alert и print, тоже самое...

 
jeronimo:

И ещё такой вопрос - у меня почему то действительные числа более 4 знаков (после запятой) типа 1.554878, окргуляются до 4 знака. Т.е. будет 1.5549.

пример

Выдает: 1.1059.

У кого-нибудь такое было?

ЗЫ пробовал и с alert и print, тоже самое...


void Print(     ...)
Печатает некоторое сообщение в журнал экспертов. Параметры могут иметь любой тип. Количество параметров не может превышать 64.

Массивы нельзя передать в функцию Print(). Массивы должны быть напечатаны поэлементно.

Данные типа double выводятся с 4 десятичными цифрами после точки. Чтобы получить большую точность, следует использовать 
функцию DoubleToStr().
Данные типов bool, datetime и color будут напечатаны в виде чисел.
Чтобы печатать значения datetime как строку с датой, следует использовать функцию TimeToStr().
См. также функции Alert() и Comment().
https://docs.mql4.com/ru/common/Print
 
Спб, не заметил, вроде всё.
Причина обращения: