Uso confiable de dobles como std :: map keys

Uno de mis compañeros de trabajo recientemente mencionó un truco interesante para usar de manera confiable los números de coma flotante como claves en algo así como unstd::map en C ++.

Suponiendo que desea utilizar mayúsculas y minúsculas en algún valor de coma flotante (comoprice), y usted sabe que estos valores solo pueden tomar valores discretos a pesar de representar números reales (por ejemplo, a intervalos de un ciertoticksize), el siguiente fragmento de código convierte de manera confiable una entradaprice a unlong long preciollave:

double price, ticksize; // Initialized elsewhere
long long priceKey = 0;

if ((price / ticksize) < (ticksize / 2)) {
    priceKey = (long long) (price / ticksize);
} else {
    priceKey = (long long) ((price / ticksize) + (ticksize / 2));
}

Por ejemplo, siprice = 98.05 yticksize = 0.05, luego terminamos con el siguiente resultado:

price / ticksize = 1960.9999999999998
ticksize / 2 = 0.025
priceKey = (long long) 1960.9999999999998 + 0.025 = 1961

priceKey luego podría ser utilizado en algo así comostd::map<long long, order_t> para recuperar de manera confiable los pedidos a un nivel de precio particular.

¿Hay algún caso en el que tal lógica fallara? Traté de encontrar una prueba de por qué esto podría funcionar, pero no creo que tenga suficiente experiencia con la aritmética de coma flotante para razonarlo.

Respuestas a la pregunta(1)

Su respuesta a la pregunta