Una cosa que me gustaría ver sería un reconocimiento de que doublea floatdebe ser considerada como una conversión de ampliación, mientras floatque doublese está estrechando (*). Eso puede parecer contrario a la intuición, pero considere lo que realmente significan los tipos:
- 0.1f significa "13,421,773.5 / 134,217,728, más o menos 1 / 268,435,456 más o menos".
- 0.1 realmente significa 3,602,879,701,896,397 / 36,028,797,018,963,968, más o menos 1 / 72,057,594,037,927,936 más o menos "
Si uno tiene una doubleque tiene la mejor representación de la cantidad "una décima" y la convierte float, el resultado será "13,421,773.5 / 134,217,728, más o menos 1 / 268,435,456 más o menos", que es una descripción correcta del valor.
Por el contrario, si uno tiene una floatque tiene la mejor representación de la cantidad "una décima" y la convierte double, el resultado será "13,421,773.5 / 134,217,728, más o menos 1 / 72,057,594,037,927,936 más o menos" - un nivel de precisión implícita lo cual está mal por un factor de más de 53 millones.
Aunque el estándar IEEE-744 requiere que las matemáticas de punto flotante se realicen como si cada número de punto flotante representara la cantidad numérica exacta precisamente en el centro de su rango, eso no debe suponerse que los valores de punto flotante realmente representan esos números exactos cantidades numéricas Más bien, el requisito de que se suponga que los valores están en el centro de sus rangos se deriva de tres hechos: (1) los cálculos deben realizarse como si los operandos tuvieran algunos valores precisos particulares; (2) los supuestos consistentes y documentados son más útiles que los inconsistentes o indocumentados; (3) si uno va a hacer una suposición consistente, ninguna otra suposición consistente es mejor que asumir que una cantidad representa el centro de su rango.
Por cierto, recuerdo que hace unos 25 años, a alguien se le ocurrió un paquete numérico para C que usaba "tipos de rango", cada uno de los cuales constaba de un par de flotadores de 128 bits; todos los cálculos se realizarían de tal manera que se calcule el valor mínimo y máximo posible para cada resultado. Si se realiza un cálculo iterativo largo y grande y se obtiene un valor de [12.53401391134 12.53902812673], se puede estar seguro de que si bien se perdieron muchos dígitos de precisión debido a errores de redondeo, el resultado aún podría expresarse razonablemente como 12.54 (y no fue así) t realmente 12.9 o 53.2). Me sorprende que no haya visto ningún soporte para estos tipos en ningún lenguaje convencional, especialmente porque parecería encajar bien con unidades matemáticas que pueden operar en múltiples valores en paralelo.
(*) En la práctica, a menudo es útil usar valores de doble precisión para mantener cálculos intermedios cuando se trabaja con números de precisión simple, por lo que tener que usar un tipo de letra para todas esas operaciones podría ser molesto. Los idiomas podrían ayudar al tener un tipo de "doble difuso", que realizaría cálculos como dobles, y podría emitirse libremente desde y hacia el sencillo; Esto sería especialmente útil si las funciones que toman parámetros de tipo doubley retorno doublepudieran marcarse de modo que generen automáticamente una sobrecarga que acepte y devuelva "doble difuso".