78 lines
3.2 KiB
Markdown
78 lines
3.2 KiB
Markdown
# Algoritmo de parseo de numeros (double) - (fast)
|
|
|
|
Aqui detallo la implemtancino de un aglrotimo que he diseñado (codigo en si.. no maths)
|
|
para el parseo de str a double tomando varias ideas de otros parsers..
|
|
|
|
|
|
## 1. Inicio de variables
|
|
Por parte del user se garantiza como minimo 1 char valido, ahora si continuemos, en esta
|
|
parte la idea sera iniclizacion 5 variables que usaremos...
|
|
|
|
```mql5
|
|
val = 0.0; // valor inicial a 0.0
|
|
ulong v = 0; // valor double
|
|
uchar ch = (uchar)str[pos] ^ '0'; // primer caracter
|
|
long mask = 0; // mascara para negacion branchlees
|
|
int lock = pos; // posicion de lockeo (esto para hacer un rollback usando stringtodobule luego) y contar digitos
|
|
```
|
|
|
|
## 2. Primer caracter
|
|
En esta parte en caso el ch incila sea mayor a 9 (no sea un numero), haremos lo siguiente..
|
|
en un swith evaluamos dicho caracter en 3 casos:
|
|
1. ('+' ^ '0'): entonces aumentamos pos en 1 y lock en 1 luego volvemos a calucalr el siguinetre caracter "xoreado" con '0'
|
|
y en caso no sea un digito solo peude ser . si no lo es salimos..
|
|
2. ('-' ^ '0'): modicmoas el valor de la mascakra en -1 y amentos el pos en 1, luego obtener el siguiente caracter y
|
|
le aplicos un xor con '0' si es mayor a 9 buscmos que sea . si no lo es salimos.
|
|
3. ('.' ^ '0'): ponemos ch en 0 y pos en -1 (para uqe luego en el primer ++ del leading zeros apunte
|
|
al . y salga limpio para dec)
|
|
|
|
|
|
## 3. Parseo de la parte entera
|
|
|
|
En un while(true)
|
|
haremos 3 "fases" para ir quirurgicamente..
|
|
iniclamte se nos gartaniza que ch es un valor valido (numero).. como hemos hecho en las primeras fases..
|
|
ahora en total haremos unas 19 iteraciones..
|
|
cada iteracion consiste en:
|
|
1. multiplicar "v" * 10 y luego sumarle "ch"
|
|
2. Aumentar pos en 1 y luego comparar con len del string si es mayor o igual (sale)
|
|
3. En caso el shortchut del 2. no funciono "xoreamos" con '0', si ch es mayor a 10 entonces ya no tenemos mas digitos (sale)
|
|
|
|
### 1 Fase (leading zeros)
|
|
Ejeuctaimso una iteracion del algoritmo... tal cual...
|
|
luego de eso vericaremos que
|
|
- Si v es 0 (!v), osea el primer caracter es 0 pero aun hay digitos numericos entonces ejecutaremos lo siguiente
|
|
en un bucle:
|
|
> - aumentar pos en 1 y comprar con <= con len, si es false sale
|
|
> - luego ch lo asignaas con = como str[pos], si no es igual al caracter '0' sale
|
|
Esto lo repetis.. por ejemplo se veria algo asi
|
|
|
|
```mql5
|
|
do
|
|
{
|
|
if(++pos >= s_len)
|
|
return;
|
|
}
|
|
while((ch = (uchar)str[pos]) == '0');
|
|
```
|
|
|
|
Lugeo de eso vericias si pos es mayor o igualk a len si es asi entonces todo era 00000
|
|
por lo que sales limpio con un return,
|
|
Si pasa eso.. entonces "xorea" ch con 0.. si es mayor a 9 entonces el lock lo pones como pos-1
|
|
esto debido a que tnemeo xy donde ahora mismo estamos en y el caracter con el digito real..
|
|
la idea es incluir al "ultimo" 000xy... osea solo qudarse con xy...
|
|
y lueso sales con un break del bucle o sale solo si es while()
|
|
en caso si sea un numero entonces lock=pos y luego ejeuctas una iteracion ahi mismo..
|
|
|
|
## 2 Fase (u18)
|
|
|
|
En un macro o repitiendo codigo repites 18 veces la "iteracion"
|
|
|
|
# 3 Fase
|
|
|
|
En caso se llegue aqui ya han pasado mas de 19 iutaciones por lo que ya estamos en el rango inseguro de ov
|
|
de valor asi que haremos dos cosas
|
|
seguiremos acomulando v
|
|
|
|
(ya me canse de redactar otro dia cuando tenga tiempo xddxdxdxd)
|
|
|