studio programacion para móviles libro edición desarrollo desarrollar curso aprende aplicaciones c++ dictionary floating-point set key

c++ - programacion - Maneras de usar un doble como clave en un conjunto estándar/mapa



manual de programacion android pdf (2)

Convierta todos los dobles (donde pretendíamos como claves) en enteros multiplicándolos por el factor de precisión (por ej. 1e8) y redondeando al entero más cercano (int) i + 0.5 (si i> 0), luego cree un conjunto / mapa que claves de estos enteros. Al extraer los valores finales de las claves, divida las entradas por el factor de precisión para recuperar el valor doble (aunque sea redondeado).

En lugar de dividir por el factor de precisión para recuperar los dobles, simplemente almacene el doble junto con el valor asociado en una estructura, y ponga esa estructura en el diccionario como el "valor" para esa clave entera. De esta forma, el doble valor original todavía está disponible y puede usarse para cálculos. Simplemente no para la búsqueda de clave.

Sin embargo, si puede vivir con valores ligeramente redondeados (debido a que simplemente divide un entero por un épsilon), su enfoque sugerido ya es lo suficientemente bueno.

Como dice la otra respuesta, depende mucho del rango de los valores. Si algunos son extremadamente grandes y otros son extremadamente pequeños, su enfoque para obtener claves enteras no funcionará. Si solo tienen algunos dígitos separados, entonces podría ser.

El problema de usar dobles como claves en mapas / conjuntos es la precisión del punto flotante.

Algunas personas han sugerido agregar un epsilon en su función de comparación, pero eso significa que sus claves ya no cumplirán el criterio estricto de ordenamiento débil necesario. Esto significa que obtendrá un conjunto / mapa diferente dependiendo del orden de inserción de sus elementos.

En el caso en que desee agregar / combinar / fusionar datos basados ​​en valores dobles, y esté dispuesto a permitir un cierto nivel de redondeo / épsilon (claramente, deberá hacerlo), ¿es la siguiente solución una buena idea?

Convierta todos los dobles (donde pretendíamos como claves) en enteros multiplicándolos por el factor de precisión (por ej. 1e8) y redondeando al entero más cercano (int)i+0.5 (si i> 0), luego cree un conjunto / mapa que claves de estos enteros. Al extraer los valores finales de las claves, divida las entradas por el factor de precisión para recuperar el valor doble (aunque sea redondeado).


"Convierta todos los dobles (donde pretendíamos como claves) en enteros multiplicándolos por el factor de precisión (por ej. 1e8) y redondeando al entero más cercano (int)i+0.5 (si i> 0), luego cree un conjunto / mapa que descifra estos enteros. Al extraer los valores finales de las claves, divida las entradas por el factor de precisión para recuperar el doble valor (aunque sea redondeado) ".

Recomendaría utilizar claves de tipo entero (por ejemplo, long long ) para el mapa en primer lugar, y recortarlas para la representación doble con una precisión fija para la división.

Pero eso depende, si puede aplicar matemática de punto fijo para su caso de uso real. Si necesita cubrir una amplia gama de precisiones de valor (como, por ejemplo, + -1e-7 - + -1e7), dicho enfoque no funcionará.