Округление чисел в МТ4 через NormalizeDouble - страница 4

 
Dmitry Fedoseev:
Потому-что равно 0.6, поэтому 0.5 получается только путем мухлежа. 

 

double v1 = 1.1234567;

 если 'v1' вставить любое число тогда видно что до 'i = 2' все округляется правильно.

 
lilita bogachkova:

 

 если 'v1' вставить любое число тогда видно что до 'i = 2' все округляется правильно.

После i=2 неправильно что ли?
 
Ihor Herasko:

Когда нормализуется только один знак, то там все просто: 0, 1, 2, 3, 4 -> 0, а 5, 6, 7, 8, 9 -> 1

Если нормализуется два знака, то в расчет принимаются двузначные числа: 0 - 49 -> 0, а 50 - 99 -> 1. Ведь если число 1.49 нужно округлить до целых, то неужели должны получить 2, до которого 51-а сотая против имеющихся 49-и сотых расстояния до 1? 

Тоже самое с трехзначными, четырехзначными и т. д.

Но 1.45 и округляется до 2, но только если оно до того было нормализовано на одну степень большей точностью.

void OnStart()
  {
   for(int i=7;i>=0;i--)
     {
      double v1 = 1.4545454;
      double v2 = NormalizeDouble(v1,i+1);

      v1=NormalizeDouble(v1,i);
      v2=NormalizeDouble(v2,i);
      Print("v1 = ",i," = ",DoubleToString(v1,7),", v2 = ",i," = ",DoubleToString(v2,7));
     }
     Print("---");
  }


v1 = 0 = 1.0000000, v2 = 0 = 2.0000000

v1 = 1 = 1.5000000, v2 = 1 = 1.5000000

v1 = 2 = 1.4500000, v2 = 2 = 1.4600000

v1 = 3 = 1.4550000, v2 = 3 = 1.4550000 

 

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


 
lilita bogachkova:

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


Выше такие действия и были названы "мухлежом")) Математика, хоть и точная наука, но все равно должна применяться с пониманием. 2 + 3 = 5, а вот если 2 ведра плюс 3 курицы, то 5 уже не выйдет ))
 

Простите, но как же получать нужные значения?

Если пользоваться рекомендованными функциями, то:

- в одном случае получаю правильно округленное значение
0.06-0.02NormalizeDouble(0.03999999999999999,2) = 0.04
Деление выполняется приближенно и без нормализации не обойтись.

- во втором случае получаю тоже округление, но в данном случае оно не нужно
0.06-0.024 = NormalizeDouble(0.036,2) = 0.04
Здесь нормализация (округление) не требуется.

Но как мне правильно нормализировать, а не округлять значения?

 
Roman Starinskij:

Простите, но как же получать нужные значения?

Для этого просто стоит сформулировать, что такое "нужные значения" ))

 Если пользоваться рекомендованными функциями, то:

- в одном случае получаю правильно округленное значение
0.06-0.02 = NormalizeDouble(0.03999999999999999,2) = 0.04
Деление выполняется приближенно и без нормализации не обойтись.

- во втором случае получаю тоже округление, но в данном случае оно не нужно
0.06-0.024 = NormalizeDouble(0.036,2) = 0.04
Здесь нормализация (округление) не требуется.

Но как мне правильно нормализировать, а не округлять значения?

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

Хотя самый простой способ - заранее определиться с необходимой точностью вычислений. 

 
Ihor Herasko:

Для этого просто стоит сформулировать, что такое "нужные значения" ))

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

Хотя самый простой способ - заранее определиться с необходимой точностью вычислений. 


Мне всего-то нужно получит такие же числа, которые привык получать в калькуляторе. :-) Это и есть нужные значения. 
Чтобы при "0.06-0.02" получить "0.04", а при "0.06-0.024" получить "0.036".
 
Roman Starinskij:

Мне всего-то нужно получит такие же числа, которые привык получать в калькуляторе. :-) Это и есть нужные значения. 
Чтобы при "0.06-0.02" получить "0.04", а при "0.06-0.024" получить "0.036".
Если надо получить 0.036 (3 знака после запятой), то и нормализовать надо до 3-ех знаков, а не до 2-ух.
 
Dmitry Fedoseev:
Если надо получить 0.036 (3 знака после запятой), то и нормализовать надо до 3-ех знаков, а не до 2-ух.

Я ошибся, до 3-х знаков нужно нормализировать. Так получится сделать?

 
Roman Starinskij:

Я ошибся, до 3-х знаков нужно нормализировать. Так получится сделать?

Вот ваш код:

0.06-0.024 = NormalizeDouble(0.036,2) = 0.04

 Вместо 2 поставить 3 и будет 0.036