NormalizeDouble을 사용하여 MT4에서 숫자 반올림 - 페이지 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, 사용 가능한 49/1에 대해 최대 51/100은?

세 자리, 네 자리 등도 마찬가지입니다.

그러나 1.45는 2로 반올림되지만 이전에 더 높은 정밀도의 1제곱으로 정규화된 경우에만 가능합니다.

 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 :

계산 중에 숫자가 더 높은 정확도로 정규화되고 후속 계산에서 이 숫자가 더 낮은 정확도로 정규화되면 단순히 정규화된 숫자와 정확도가 다른 결과를 얻습니다.


위에서 그러한 행동을 "mukhlezh"라고했습니다.)) 수학은 정확한 과학이지만 여전히 이해와 함께 적용되어야합니다. 2 + 3 = 5, 그러나 2개의 버킷과 3개의 닭이 있으면 5는 더 이상 작동하지 않습니다))
 

실례지만 원하는 값을 얻는 방법은 무엇입니까?

권장 기능을 사용하는 경우:

- 한 경우에는 올바르게 반올림된 값을 얻습니다.
0.06-0.02 = NormalizeDouble (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자리)을 구해야 하는 경우 2가 아닌 3자리로 정규화해야 합니다.
 
Dmitry Fedoseev :
0.036(소수점 3자리)을 구해야 하는 경우 2가 아닌 3자리로 정규화해야 합니다.

제가 틀렸습니다. 최대 3개의 문자를 정규화해야 합니다. 그렇게 할 수 있습니까?

 
Roman Starinskij :

제가 틀렸습니다. 최대 3개의 문자를 정규화해야 합니다. 그렇게 할 수 있습니까?

코드는 다음과 같습니다.

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

2 대신 3을 넣으면 0.036이 됩니다.