MQL4 및 MQL5에서 Digits()를 무시하고 숫자(따옴표 제외)의 쉼표 뒤 소수 자릿수 가져오기 - 페이지 22

 
Andrey Khatimlianskii :

난 필요 없어.

로더라고 하죠? ..

다음은 10,000개 요소의 배열이며, 완전히 무작위이며 각 정렬의 각 주기 전에 무작위입니다. 각 방법의 1000회 반복에 대한 총 시간(ms)입니다.

내장 ArraySort, 며칠 전에 작성된 내 방법( 정렬 알고리즘 을 전혀 다루지 않기 전) 및 라이브러리에서 가장 좋은 6가지 방법(나머지는 훨씬 나쁨), 내가 모든 것을 했음에도 불구하고 거기에서 제거 된 그래픽과 관련된 것이 ...

 #include <Sort\GSort.mqh>
#define   ttt                 template < typename T>
#define   test(M,S,EX)        { uint mss= GetTickCount (); int nn=( int ) pow ( 10 ,M); for ( int tst= 0 ;tst<nn&&! _StopFlag ;tst++){EX;} \
                                 printf ( "%s: loops=%i ms=%u" ,S,nn, GetTickCount ()-mss);}


ttt void a_rand(T&ar[]){ for ( int i= 0 ;i< ArraySize (ar);i++)ar[i]=T( rand ()* rand ());}

ttt int TreePop(T&t[],T&ar[], int i= 0 , int b= 0 )
 {
   if (t[b+ 1 ]>= 0 )i=TreePop(t,ar,i,( int )t[b+ 1 ]);
  ar[i++]=t[b];
   if (t[b+ 2 ]>= 0 )i=TreePop(t,ar,i,( int )t[b+ 2 ]);
   return i;
 }

ttt void TreeSort(T&ar[])
 {
   int sz= ArrayRange (ar, 0 );
  T t[]; ArrayResize (t,sz* 3 ); ArrayInitialize (t,- 1 );
   for ( int i= 0 ;i< ArraySize (ar);i++){t[i* 3 ]=ar[i];
     if (!i) continue ;
     int b= 0 ;
     while ( 1 )
       if (ar[i]<=t[b])
         if (t[b+ 1 ]>= 0 )b=( int )t[b+ 1 ];
         else {t[b+ 1 ]=i* 3 ; break ;}
       else
         if (t[b+ 2 ]>= 0 )b=( int )t[b+ 2 ];
         else {t[b+ 2 ]=i* 3 ; break ;}}
  TreePop(t,ar);
 }


void OnStart (){
   double ar[];
   int N= 10000 ,k= 3 ;
   ArrayResize (ar,N);

  test(k, "ArraySort(MQL5)" ,a_rand(ar); ArraySort (ar))
  test(k, "TreeSort(AntFX)" ,a_rand(ar);TreeSort(ar))
  test(k, "Merge(GSort)" ,a_rand(ar);GMergesort(ar, 0 ,N- 1 ))
  test(k, "QTernaryLL(GSort)" ,a_rand(ar);GQSortTernaryLL(ar, 0 ,N- 1 ))
  test(k, "QSortLL(GSort)" ,a_rand(ar);GQSortTernaryLL(ar, 0 ,N- 1 ))
  test(k, "QSort(GSort)" ,a_rand(ar);GQSortTernaryLR(ar, 0 ,N- 1 ))
  test(k, "QTernaryLR(GSort)" ,a_rand(ar);GQSortTernaryLR(ar, 0 ,N- 1 ))
  test(k, "Comb(GSort)" ,a_rand(ar);GComb(ar))
}
 
Ilya Malev :

로더라고 하죠? ..

다음은 10,000개 요소의 배열이며, 완전히 무작위이며 각 정렬의 각 주기 전에 무작위입니다. 각 방법의 1000회 반복에 대한 총 시간(ms)입니다.

내장 ArraySort, 며칠 전에 작성된 내 방법(정렬 알고리즘을 전혀 다루지 않기 전) 및 라이브러리에서 가장 좋은 6가지 방법(나머지는 훨씬 나쁨), 내가 모든 것을 했음에도 불구하고 거기에서 제거 된 그래픽과 관련된 것이 ...

기사의 비디오로 판단하면 가장 빠른 것은 Count, LSD 및 MSD입니다.

 
Andrey Khatimlianskii :

기사의 비디오로 판단하면 가장 빠른 것은 Count, LSD 및 MSD입니다.

나는 이 구절들이 완성되기를 기다리지 않았다.

 
Alexandr Sokolov :

소수점 이하 자릿수를 구해야 하는 경우가 드물고 Digits() 함수는 따옴표로만 작동하며 이에 대한 정보가 없는 경우가 저뿐만이 아닌 것 같습니다. 아무데나 (적어도 이전에 이 게시물을 작성할 당시에는 찾지 못했기 때문에 내가 찾은 솔루션을 보여주고 싶습니다)?


결과적으로 본질은 아주 간단하지만 여전히 한 가지 단점이 있습니다. 이 기능은 그 뒤에 다른 숫자가 없으면 0을 인식하지 못합니다. 예를 들어, 함수에 숫자 0.01이 주어지면 2를 반환하고 0.0000이면 0을 반환합니다(즉, 4개의 0이 표시되지 않음). 따라서 개발에서 이러한 단점을 고려하십시오.


MQL4의 코드


MQL5의 코드

MQL5의 코드는 약간 개선되어야 했습니다. MQL5에서 분명히 double 유형의 변수는 정수가 할당되었는지 여부에 관계없이 끝에 자동으로 0이 할당되기 때문입니다. 그리고 이러한 이유로 함수는 0을 반환하지 않았습니다.

주제가 관련이 있는 경우 내 버전은 다음과 같습니다.

int kol_Z(double zzz) { // 소수점 이하 자릿수 계산

문자열 a, d;
정수 b, c;
a=StringFormat("%g", zzz);
b=StringFind(a,".",0);
c=StringLen(a);
if (b==-1) return(0);
d=StringSubstr(a,b+1);
반환(StringLen(d));
}
 
NomadSoul :

주제가 관련이 있는 경우 내 버전 은 다음과 같습니다.

예시:

 void OnStart ()
{
     Print (kol_Z(1.001234));
}

결과: 5이지만 6이어야 합니다.

 
A100 :

예시:

결과: 5이지만 6이어야 합니다.

소수점을 계산하는 가장 쉬운 방법은?" 같은 주제입니다. 컴퓨터가 가지고 있는 가수의 길이만큼 잘라야 하는 숫자를 컴퓨터에 부여한 후 이 무한 주기 분수의 끝이 어디인지 묻는 것이 어떻게 가능합니까?

0.0001100110011001100110011(0011) - 이진 표현의 십진수 0.1. 괄호 안은 무한 분수의 주기적인 부분입니다. 그렇다면 무한한 숫자 중 처음 52개의 유효 숫자만 double에 저장되어 있다면 컴퓨터는 어떻게 대답해야 할까요?

10진수 표현에서 매우 짧은 삼항 0.1(0.33333...)이 소수점 뒤에 무한한 유효 자릿수를 갖는다는 사실에 아무도 놀라지 않습니다. 이진법 0.1은 운이 좋게도 유한한 자릿수가 있는 십진법 0.5와 같습니다. 공약수는 숫자 체계 2와 10의 두 가지 밑수에서 발견되어 줄어들었습니다. 이것은 2입니다. 두 표현 모두에서 반도 좋습니다. 0.5 => 0.1; 0.05 => 0.01 ; 0.025 => 0.001 ; 0.0125 => 0.0001. 그러나 분수의 분모에 5가 나타나자 마자 유효 숫자가 많이 있습니다.

소수 부분의 유효 자릿수는 숫자의 크기뿐만 아니라 표현에 사용된 문자의 수와 관련이 있습니다.

Самый простой способ посчитать количество знаков после запятой?
Самый простой способ посчитать количество знаков после запятой?
  • 2021.01.18
  • www.mql5.com
Есть переменная. Например: double а=0.02; Нужно написать функцию, которая считала бы количество знаков после запятой...
 

하나

세 번 출시되었습니다. 리더는 갈기 속으로 바로 숨을 들이쉬고 있습니다... 필요한 사람이 있으면 기능이 여기에 있습니다 - https://www.mql5.com/en/code/904 , 기능 이름은 SortHoareUp입니다.

 
Dmitry Fedoseev :

세 번 출시되었습니다. 리더는 갈기 속으로 바로 숨을 들이쉬고 있습니다... 필요한 사람이 있으면 기능이 여기에 있습니다 - https://www.mql5.com/en/code/904 , 기능 이름은 SortHoareUp입니다.

stat의 MathQuickSort () 도 있습니다. 라이브러리 (#include <Math\Stat\Math.mqh>). 나는 그들이 매우, 매우 빠른 라이브러리를 쓴 기사가 있었던 것을 기억합니다)

속도를 측정하지 않고 원래 배열의 인덱스 배열을 저장할 수 있는 기능 때문에 주로 사용합니다.

 
Vladimir :

소수점을 계산하는 가장 쉬운 방법은?" 컴퓨터가 가지고 있는 가수의 길이만큼 잘라야 하는 숫자를 컴퓨터에 부여한 후 이 무한 주기 분수의 끝이 어디인지 묻는 것이 어떻게 가능합니까?

0.0001100110011001100110011(0011) - 이진 표현의 십진수 0.1. 괄호 안은 무한 분수의 주기적인 부분입니다. 그렇다면 무한한 숫자 중 처음 52개의 유효 숫자만 double에 저장되어 있다면 컴퓨터는 어떻게 대답해야 할까요?

10진수 표현에서 매우 짧은 삼항 0.1(0.33333...)이 소수점 뒤에 무한한 유효 자릿수를 갖는다는 사실에 아무도 놀라지 않습니다. 이진법 0.1은 운이 좋게도 유한한 자릿수가 있는 십진법 0.5와 같습니다. 공약수는 숫자 체계 2와 10의 두 가지 밑수에서 발견되어 줄어들었습니다. 이것은 2입니다. 두 표현 모두에서 반도 좋습니다. 0.5 => 0.1; 0.05 => 0.01 ; 0.025 => 0.001 ; 0.0125 => 0.0001. 그러나 분수의 분모에 5가 나타나자 마자 - 그게 다야, 많은 유효 숫자가 있습니다.

소수 부분의 유효 자릿수는 숫자의 크기뿐만 아니라 표현에 사용된 문자의 수와 관련이 있습니다.

해결해야 할 문제의 조건을 결정하기 시작하는 것이 좋습니다. 컴퓨터의 숫자 표현에 대한 이론적 연구에 대해 이야기하고 있다면 이 연구의 목적에 대한 추가 설명이 필요합니다.

질문이 NormalizeDouble() 함수에 대한 두 번째 인수로 제공할 정수인 경우 동일한 함수를 사용하여 답을 찾아야 합니다. 이것은 정규화된 숫자가 원본과 같을 0에서 8 사이의 최소 정수가 됩니다. 그러한 정수가 없으면 원래 숫자가 잘못된 것입니다. 다음은 최소 볼륨 단계에 대해 문자 수를 계산하는 코드 예입니다.