绕过MQL4和MQL5中的Digits(),获取任何数字的小数位数(不仅仅是引号)。 - 页 22 1...1516171819202122 新评论 Ilya Malev 2018.12.10 11:44 #211 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)) } Andrey Khatimlianskii 2018.12.10 12:13 #212 Ilya Malev:你有一张大嘴,不是吗......? 这里有一个包含10000个元素的数组,完全随机化,在每个排序周期前都随机化。每种方法重复1000次的总时间(毫秒)。 内置的ArraySort,我几天前写的方法(在此之前我根本没有做排序算法),以及你库中的6个最好的方法(其余的更差),同时我从那里删除了所有与图形相关的东西... 从文章的视频来看,最快的是伯爵、LSD和MSD。 Ilya Malev 2018.12.10 12:25 #213 Andrey Khatimlianskii:从文章中的视频来看,最快的是伯爵、LSD和MSD。我从来没有等待过这些通行证的完成。 NomadSoul 2021.02.24 10:40 #214 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))。 } A100 2021.02.24 16:35 #215 NomadSoul: 如果这个话题是相关的,这里有我的看法。 例子。 void OnStart() { Print(kol_Z(1.001234)); } 结果:5,应该是6 Vladimir 2021.02.24 20:52 #216 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.18www.mql5.com Есть переменная. Например: double а=0.02; Нужно написать функцию, которая считала бы количество знаков после запятой... Dmitry Fedoseev 2021.02.25 12:07 #217 我已经跑了三次。它在领导的脖子上呼吸......如果有人需要,这里的函数是https://www.mql5.com/ru/code/904, 函数名称是SortHoareUp。 Aleksey Nikolayev 2021.02.25 15:41 #218 Dmitry Fedoseev: 我已经跑了三次。它在领导的脖子上呼吸......如果有人需要,这里的函数是https://www.mql5.com/ru/code/904, 函数名称是SortHoareUp。 还有库中的MathQuickSort()(#include <Math\Stat\Math.mqh>)。我记得有一篇文章,他们写道,这是非常-非常快的图书馆)。 我没有测量过速度,我使用它主要是因为它允许我保存源数组的索引阵列。 Aleksey Nikolayev 2021.02.25 16:00 #219 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之间的最小整数,对它来说,归一化的数字将等于源数字。如果找不到这样的整数,则说明源号码不正确。下面是一个代码 的例子,其中数字的数量被计算为最小音量的步骤。 1...1516171819202122 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
我不需要。
你有一张大嘴,不是吗......?
这里有一个包含10000个元素的数组,完全随机化,在每个排序周期前都随机化。每种方法重复1000次的总时间(毫秒)。
内置的ArraySort,我几天前写的方法(在此之前我根本没有做过排序算法),以及你库中的6个最好的方法(其余的更差),同时我从那里删除了所有与图形相关的东西...
你有一张大嘴,不是吗......?
这里有一个包含10000个元素的数组,完全随机化,在每个排序周期前都随机化。每种方法重复1000次的总时间(毫秒)。
内置的ArraySort,我几天前写的方法(在此之前我根本没有做排序算法),以及你库中的6个最好的方法(其余的更差),同时我从那里删除了所有与图形相关的东西...
从文章的视频来看,最快的是伯爵、LSD和MSD。
从文章中的视频来看,最快的是伯爵、LSD和MSD。
我从来没有等待过这些通行证的完成。
我想我不是唯一一个遇到罕见情况的人,我需要得到小数点后的数字,而Digits()函数 只对引号起作用,此外,在任何地方都没有相关信息(至少在写这篇文章时,我以前没有发现,所以我想展示我找到的解决方案)。
事实证明,平庸的本质是简单的,但仍然有一个缺点 - 这个功能不承认零,如果他们之后没有其他数字。例如,这个函数在0.01后面会返回2,但在0.0000后面会返回0(这意味着它不能看到四个零)。因此,在你的发展中要考虑这个缺点。
MQL4中的代码
在MQL5的代码
MQL5的代码必须稍作改进,因为显然在MQL5中,双倍类型的变量在最后会自动分配为0,无论该变量是否为整数。也正因为如此,该函数从未返回过0。
如果这个话题是相关的,这里是我的例子。
int kol_Z(double zzz) { // 计算小数点后的数字
如果这个话题是相关的,这里有我的看法。
例子。
结果:5,应该是6
例子。
结果: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出现在分数的分母中,那就是了,有很多重要的数字。
小数部分的有效数字与表示方法中使用的字符数有关,而不仅仅是与数字的值有关。
我已经跑了三次。它在领导的脖子上呼吸......如果有人需要,这里的函数是https://www.mql5.com/ru/code/904, 函数名称是SortHoareUp。
我已经跑了三次。它在领导的脖子上呼吸......如果有人需要,这里的函数是https://www.mql5.com/ru/code/904, 函数名称是SortHoareUp。
还有库中的MathQuickSort()(#include <Math\Stat\Math.mqh>)。我记得有一篇文章,他们写道,这是非常-非常快的图书馆)。
我没有测量过速度,我使用它主要是因为它允许我保存源数组的索引阵列。
小数点位数的 最简单方法?"基本上是同一个话题。你怎么能给计算机一个数字,让它截断到它所拥有的尾数的长度,然后问它那个无限的周期性分数的终点在哪里?
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之间的最小整数,对它来说,归一化的数字将等于源数字。如果找不到这样的整数,则说明源号码不正确。下面是一个代码 的例子,其中数字的数量被计算为最小音量的步骤。