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

 

Вот так всегда 7:

int start()
  {
//----
  double x=(1.0548-1.0541)/Point;
  Alert("_________",DoubleToStr((1.0548-1.0541)/Point,8));
 int delta=MathRound((1.0548-1.0541)/Point);
 Alert(delta);
   return(0);
  }
 
Sepulca:

Вот так всегда 7:


Вопрос в том почему не работает первый вариант из первого поста:

1 вариант.

int start()
{
int delta;

delta=(1.0548-1.0541)/Point;


Comment(delta);
return(0);

}

Результат:delta = 6.

А должно быть 7

меня волнует внутренний принцип по которому

происходят вычисления в 1 варианте и получается 6, а не 7.

Кроме того по правилам приведения типов у меня должно быть 7.
 
Есть такие случаи в жизни, когда не надо гадать и ломать себе и окружающим мозги, надо просто делать так, как правильно.
 
jeronimo:

Вопрос в том почему не работает первый вариант из первого поста:

1 вариант.

int start()
{
int delta;

delta=(1.0548-1.0541)/Point;


Comment(delta);
return(0);

}

Результат:delta = 6.


А должно быть 7

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

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

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

 
jeronimo:

Вопрос в том почему не работает первый вариант из первого поста:

1 вариант.

int start()
{
int delta;

delta=(1.0548-1.0541)/Point;


Comment(delta);
return(0);

}

Результат:delta = 6.

А должно быть 7

Особенности хранения и вычисления действительных чисел в компьютере. Это мат. процессор, а не MQL

int start() {
   int delta=0;
   double d=0;
   d=(1.0548-1.0541)/Point;
   delta=d;
   Alert("int delta = "+delta+", double d = "+d);
   return(0);
}
 

Кажется, понял почему так.

Здесь нет мусора -> (1.0548-1.0541). Мусор появляется после деления.

Когда происходит деление на число меньше единицы, то это аналогично умножению. Т.е. значимая часть числа сдвигается влево и тянет за собой мусор в новых разрядах справа.

 
Zhunko:

Кажется, понял почему так.

Здесь нет мусора -> (1.0548-1.0541). Мусор появляется после деления.

Когда происходит деление на число меньше единицы, то это аналогично умножению. Т.е. значимая часть числа сдвигается влево и тянет за собой мусор.


посмотрите в студии эта разница не равна 0.0007.
 
VladislavVG:

посмотрите в студии эта разница не равна 0.0007.

И правда!

Константа чистая. Результат не очень.


 

Если сделать так

 int delta=(1.0548-1.0541)/0.00000000001;
 Alert(delta);

то получим

 
Если так докапываться по всяким мелочам, жизни не хватит овладеть языком! А многие владеют многими!
Причина обращения: