绕过MQL4和MQL5中的Digits(),获取任何数字的小数位数(不仅仅是引号)。 - 页 22

 
Andrey Khatimlianskii:

我不需要。

你有一张大嘴,不是吗......?

这里有一个包含10000个元素的数组,完全随机化,在每个排序周期前都随机化。每种方法重复1000次的总时间(毫秒)。

内置的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:

你有一张大嘴,不是吗......?

这里有一个包含10000个元素的数组,完全随机化,在每个排序周期前都随机化。每种方法重复1000次的总时间(毫秒)。

内置的ArraySort,我几天前写的方法(在此之前我根本没有做排序算法),以及你库中的6个最好的方法(其余的更差),同时我从那里删除了所有与图形相关的东西...

从文章的视频来看,最快的是伯爵、LSD和MSD。

 
Andrey Khatimlianskii:

从文章中的视频来看,最快的是伯爵、LSD和MSD。

我从来没有等待过这些通行证的完成。

 
Alexandr Sokolov:

我想我不是唯一一个遇到罕见情况的人,我需要得到小数点后的数字,而Digits()函数 只对引号起作用,此外,在任何地方都没有相关信息(至少在写这篇文章时,我以前没有发现,所以我想展示我找到的解决方案)。


事实证明,平庸的本质是简单的,但仍然有一个缺点 - 这个功能不承认零,如果他们之后没有其他数字。例如,这个函数在0.01后面会返回2,但在0.0000后面会返回0(这意味着它不能看到四个零)。因此,在你的发展中要考虑这个缺点。


MQL4中的代码


在MQL5的代码

MQL5的代码必须稍作改进,因为显然在MQL5中,双倍类型的变量在最后会自动分配为0,无论该变量是否为整数。也正因为如此,该函数从未返回过0。

如果这个话题是相关的,这里是我的例子。

int kol_Z(double zzz) { // 计算小数点后的数字

串 a, d;
int b, c;
a=StringFormat("%g", zzz)。
b=StringFind(a,".",0)。
c=StringLen(a)。
如果(b==-1)返回(0)。
d=StringSubstr(a,b+1)。
return(StringLen(d))。
}
 
NomadSoul:

如果这个话题是相关的,这里有我的看法

例子。

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

结果:5,应该是6

 
A100:

例子。

结果:5,应该是6。

小数点位数的 最简单方法?"是同一个话题。当你给计算机一个数字,要求它截断到它的尾数长度时,你怎么能问它那个无限周期分数的终点在哪里?

0.000110011001100110011(0011)是一个十进制数字0.1的二进制表示。在括号内的是无限小数的周期部分。那么,如果计算机只将无限大的数字的前52位有效数字存储在双倍数中,应该怎么回答呢?

没有人感到惊讶,非常短的三元数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; Нужно написать функцию, которая считала бы количество знаков после запятой...
 

1

我已经跑了三次。它在领导的脖子上呼吸......如果有人需要,这里的函数是https://www.mql5.com/ru/code/904, 函数名称是SortHoareUp。

 
Dmitry Fedoseev:

我已经跑了三次。它在领导的脖子上呼吸......如果有人需要,这里的函数是https://www.mql5.com/ru/code/904, 函数名称是SortHoareUp。

还有库中的MathQuickSort()(#include <Math\Stat\Math.mqh>)。我记得有一篇文章,他们写道,这是非常-非常快的图书馆)。

我没有测量过速度,我使用它主要是因为它允许我保存源数组的索引阵列。

 
Vladimir:

小数点位数的 最简单方法?"基本上是同一个话题。你怎么能给计算机一个数字,让它截断到它所拥有的尾数的长度,然后问它那个无限的周期性分数的终点在哪里?

0.000110011001100110011(0011)是一个十进制数字0.1的二进制表示。在括号内的是无限小数的周期部分。那么,如果计算机只将无限大的数字的前52位有效数字存储在双倍数中,应该怎么回答呢?

没有人感到惊讶,非常短的三元数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之间的最小整数,对它来说,归一化的数字将等于源数字。如果找不到这样的整数,则说明源号码不正确。下面是一个代码 的例子,其中数字的数量被计算为最小音量的步骤。