şundan çatallanmış nique_372/TSNStd
219 satır
5,1 KiloByte
MQL5
219 satır
5,1 KiloByte
MQL5
//+------------------------------------------------------------------+
| |
//| ToStr.mq5 |
| |
//| Copyright 2026, Niquel Mendoza. |
| |
//| https://www.mql5.com |
| |
//+------------------------------------------------------------------+
| |
#property copyright "Copyright 2026, Niquel Mendoza."
| |
#property link "https://www.mql5.com"
| |
#property version "1.00"
| |
#property strict
| |
| |
//+------------------------------------------------------------------+
| |
//| |
| |
//+------------------------------------------------------------------+
| |
#include <TSN\\Tables\\Basic.mqh>
| |
#include <TSN\\BInt\\Def.mqh>
| |
| |
//+------------------------------------------------------------------+
| |
//| |
| |
//+------------------------------------------------------------------+
| |
namespace TSN
| |
{
| |
| |
int CountDigits(const ulong v)
| |
{
| |
if(v < 10000000000ULL)
| |
{
| |
if(v < 100000ULL)
| |
{
| |
if(v < 100ULL)
| |
return (v < 10ULL) ? 1 : 2;
| |
if(v < 1000ULL)
| |
return 3;
| |
return (v < 10000ULL) ? 4 : 5;
| |
}
| |
if(v < 10000000ULL)
| |
return (v < 1000000ULL) ? 6 : 7;
| |
if(v < 1000000000ULL)
| |
return (v < 100000000ULL) ? 8 : 9;
| |
return 10;
| |
}
| |
if(v < 1000000000000000ULL) // 11 a 15
| |
{
| |
if(v < 1000000000000ULL)
| |
return (v < 100000000000ULL) ? 11 : 12;
| |
if(v < 100000000000000ULL)
| |
return (v < 10000000000000ULL) ? 13 : 14;
| |
return 15;
| |
}
| |
if(v < 100000000000000000ULL)
| |
return (v < 10000000000000000ULL) ? 16 : 17;
| |
if(v < 10000000000000000000ULL)
| |
return (v < 1000000000000000000ULL) ? 18 : 19;
| |
return 20;
| |
}
| |
| |
//+------------------------------------------------------------------+
| |
//| |
| |
//+------------------------------------------------------------------+
| |
void ToValueNSigned(const long value, uchar &in[], int& w)
| |
{
| |
//---
| |
if(value == 0)
| |
{
| |
in[w++] = '0';
| |
return;
| |
}
| |
| |
//---
| |
ulong uvalue;
| |
if(value < 0)
| |
{
| |
in[w++] = '-';
| |
uvalue = ulong(-(value + 1)) + 1;
| |
}
| |
else
| |
uvalue = ulong(value);
| |
| |
//---
| |
int pos = w + CountDigits(uvalue);
| |
w = pos;
| |
| |
//---
| |
while(uvalue >= 100)
| |
{
| |
const ulong prev = uvalue;
| |
uvalue /= 100ULL;
| |
const ulong idx = (prev - (uvalue * 100ULL)) << 1;
| |
in[--pos] = g_tsn_digit_pairs[idx + 1];
| |
in[--pos] = g_tsn_digit_pairs[idx];
| |
}
| |
if(uvalue >= 10)
| |
{
| |
const ulong idx = uvalue << 1;
| |
in[--pos] = g_tsn_digit_pairs[idx + 1];
| |
in[--pos] = g_tsn_digit_pairs[idx];
| |
}
| |
else
| |
in[--pos] = uchar('0' + uvalue);
| |
}
| |
| |
| |
| |
//+------------------------------------------------------------------+
| |
//| |
| |
//+------------------------------------------------------------------+
| |
void ToValueNSigned2(const long value, uchar &in[], int& w)
| |
{
| |
//---
| |
if(value == 0)
| |
{
| |
in[w++] = '0';
| |
return;
| |
}
| |
| |
//--
| |
int pos = 0;
| |
ulong uvalue;
| |
if(value < 0)
| |
{
| |
in[w++] = '-';
| |
uvalue = ulong(-(value + 1)) + 1;
| |
}
| |
else
| |
{
| |
uvalue = ulong(value);
| |
}
| |
| |
//---
| |
static uchar digits[24];
| |
int n = 0;
| |
| |
//---
| |
while(uvalue >= 100)
| |
{
| |
const ulong prev = uvalue;
| |
uvalue /= 100ULL;
| |
const ulong idx = (prev - (uvalue * 100ULL)) << 1ULL;
| |
digits[n++] = g_tsn_digit_pairs[idx + 1];
| |
digits[n++] = g_tsn_digit_pairs[idx];
| |
}
| |
if(uvalue >= 10)
| |
{
| |
const ulong idx = (uvalue << 1);
| |
digits[n++] = g_tsn_digit_pairs[idx + 1];
| |
digits[n++] = g_tsn_digit_pairs[idx];
| |
}
| |
else
| |
{
| |
digits[n++] = uchar('0' + uvalue);
| |
}
| |
| |
//---
| |
for(int j = n - 1; j >= 0; j--)
| |
in[w++] = digits[j];
| |
}
| |
}
| |
| |
//+------------------------------------------------------------------+
| |
//| Script program start function |
| |
//+------------------------------------------------------------------+
| |
void OnStart()
| |
{
| |
const int N = 1000000;
| |
| |
uchar arr[];
| |
ArrayResize(arr, 32); // una vez
| |
| |
long vals[];
| |
ArrayResize(vals, N);
| |
MathSrand(GetTickCount());
| |
for(int i = 0; i < N; i++)
| |
vals[i] = (long)MathRand() * MathRand() * MathRand();
| |
| |
| |
ulong best1 = ULONG_MAX, best2 = ULONG_MAX;
| |
| |
for(int rep = 0; rep < 10; rep++)
| |
{
| |
for(int k = 0; k < 2; k++)
| |
{
| |
const bool first_is_new = ((rep + k) % 2 == 0);
| |
| |
| |
//---
| |
ulong a = GetMicrosecondCount();
| |
if(first_is_new)
| |
{
| |
for(int i = 0; i < N; i++)
| |
{
| |
int w = 0;
| |
TSN::ToValueNSigned(vals[i], arr, w);
| |
}
| |
}
| |
else
| |
{
| |
for(int i = 0; i < N; i++)
| |
{
| |
int w = 0;
| |
TSN::ToValueNSigned2(vals[i], arr, w);
| |
}
| |
}
| |
ulong t = GetMicrosecondCount() - a;
| |
| |
//---
| |
if(first_is_new)
| |
{
| |
if(t < best1)
| |
best1 = t;
| |
}
| |
else
| |
{
| |
if(t < best2)
| |
best2 = t;
| |
}
| |
}
| |
}
| |
Print("Nueva (min de 10): ", best1, " us Vieja (min de 10): ", best2, " us");
| |
}
| |
//+------------------------------------------------------------------+
|