C ++ tiene std::nextafter()
, que devuelve el siguiente valor representable después de un valor de punto flotante dado f . En mi caso, me gustaría permitir n bits de slop en los bits de mantisa inferiores, por lo que 3 bits de slop requerirían obtener el octavo valor siguiente después de cierto valor dado f . Podría llamar nextafter()
ocho veces, pero ¿hay una mejor manera de manejar esto?
Para la mayoría de los valores, podría pasar con la conversión del valor FP a uint_64
, agregando la tolerancia ( 1<<3
para 3 bits de pendiente) y luego volviendo a double
, gracias al diseño de IEEE 754. Sin embargo, eso se basa en el punto flotante IEEE 754 ( una buena suposición, pero tampoco sólida como una roca).
(Para el fondo, quiero usar esto para izar puntos de intersección de la superficie del rayo, que ocasionalmente se encuentran dentro de la superficie debido a la imprecisión de FP. Aquellos familiarizados con el punto flotante robusto entenderán por qué epsilon
es una solución terrible).
std::numeric_limits<T>::is_iec559
para verificar si se usa IEEE 754 y especializar la función en consecuencia.