Middle
É possível usar números de ponto flutuante como chaves de contêineres?
sobes.tech IA
Resposta da IA
Não é recomendado.
Razões:
- Problemas de comparação: Os números de ponto flutuante nem sempre podem ser representados com precisão em binário. Comparar por igualdade exata
a == bpode resultar em falso devido a erros de representação. Os contêineres baseados em árvores (como mapas associados, conjuntos) e tabelas hash dependem de comparação exata ou do cálculo de hash baseado em valores precisos. - Inestabilidade do hash: O valor hash de um número de ponto flutuante, calculado com base na sua representação binária, não será estável diante de pequenas alterações no valor. Números próximos em valor podem ter hashes muito diferentes, e números iguais em valor (obtidos por cálculos diferentes devido a erros) podem ter hashes diferentes. Isso reduz a eficiência das tabelas hash (por exemplo,
std::unordered_map). - Comportamento de
NaNeInfinity: Valores especiais (NaN,Infinity) têm comportamento indefinido ou não padronizado na comparação e hashing, o que pode levar a resultados imprevisíveis.
Em vez disso, pode-se usar:
- Representação inteira, se aplicável (por exemplo, armazenar valores em centésimos).
- Classes especializadas para comparação ou hashing considerando uma margem de erro (epsilon), embora isso torne o uso de contêineres padrão mais complexo.
boost::float_column, se a biblioteca Boost for utilizada.
Exemplo do problema de comparação:
#include <iostream>
int main() {
double a = 0.1 + 0.2;
double b = 0.3;
if (a == b) {
std::cout << "0.1 + 0.2 == 0.3" << std::endl; // Pode não ser exibido
} else {
std::cout << "0.1 + 0.2 != 0.3 (devido a erro de precisão)" << std::endl;
}
return 0;
}