En ciertos algoritmos de optimización, la elección entre double
y float
es no hecho más en las demandas de espacio que la velocidad. Por ejemplo, con métodos de penalización o barrera que se usan para métodos de puntos interiores en optimización no lineal, un float
tiene una precisión insuficiente en comparación con un double
, y usar float
s en el algoritmo arrojará basura. Por esta razón, los métodos de penalización y barrera no se usaron en la década de 1960, pero se redescubrieron más tarde con el advenimiento del tipo de datos de doble precisión. (Para obtener más información sobre estos métodos, consulte Programación no lineal: técnicas secuenciales de minimización sin restricciones (Classics in Applied Mathematics) por Fiacco y McCormick.)
Otra consideración es el acondicionamiento de los sistemas lineales subyacentes resueltos en muchos algoritmos de optimización. Si los sistemas lineales que está resolviendo en algo así como una iteración de Newton están lo suficientemente mal acondicionados, no podrá obtener una solución precisa para esos sistemas.
Solo si la pérdida de precisión no pone en peligro sus valores numéricos debe considerar reemplazar double
s con float
s; incluso si las restricciones de espacio lo obligan a hacerlo, debe asegurarse de que la exactitud de sus resultados numéricos no se vea comprometida. Una vez que se asegura la precisión suficiente para los problemas en los que está trabajando, puede preocuparse por las optimizaciones de espacio y rendimiento. Puede usar el CUTEr test set para validar sus rutinas de optimización.
Si escribe su propio código en C++, ¿por qué no ha etiquetado la pregunta adecuadamente? ¿Me estoy perdiendo algo sutil? –
@HighPerformanceMark Estoy revisando el código en python (en particular scipy source) y C++, y escribiendo mi propia rutina combinando varios métodos. Debería haber etiquetado con C++ también. – octoback
Además de las cosas mencionadas, para división y raíz cuadrada, la diferencia en el rendimiento entre float y double es bastante grande. Pero esas operaciones deberían evitarse en el código de rendimiento de todos modos. – harold