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)
| |||
|