C ++ possui std::nextafter()
, que retorna o próximo valor representável após um determinado valor de ponto flutuante f . No meu caso, eu gostaria de permitir n bits de slop nos bits inferiores da mantissa, portanto, 3 bits de slop exigiriam obter o 8º próximo valor após um determinado valor f . Eu poderia ligar nextafter()
oito vezes, mas existe uma maneira melhor de lidar com isso?
Para a maioria dos valores, é possível converter o valor FP em uint_64
, adicionar a tolerância ( 1<<3
para 3 bits de slop) e depois converter novamente double
, graças ao layout do IEEE 754. No entanto, isso depende do ponto flutuante do IEEE 754 ( uma boa suposição, mas também não sólida como uma rocha).
(Como pano de fundo, quero usar isso para içar pontos de interseção da superfície dos raios, que ocasionalmente estão localizados dentro da superfície devido à imprecisão do FP. Aqueles familiarizados com o ponto flutuante robusto entenderão por que epsilon
é uma solução terrível.)
std::numeric_limits<T>::is_iec559
para verificar se o IEEE 754 é usado e especializar a função de acordo.