Cualquier punto flotante binario puede formatearse exactamente en decimal. La cadena resultante puede ser algo larga, pero es posible. En mi artículo sobre coma flotante , cubro la importancia de la precisión, y ahora quiero esta función. Este desafío es escribir un programa o función que tome un valor de coma flotante como entrada y formatee una cadena decimal exacta como salida.
Para garantizar que estamos trabajando con los números de coma flotante correctos, se debe proporcionar un formato preciso como entrada al programa. Este formato será dos enteros Significand Exponent
, donde está el valor real de coma flotante Significand * 2 ^ Exponent
. Tenga en cuenta que cualquier valor puede ser negativo.
Detalles específicos:
- El rango y la precisión de al menos un flotante de 32 bits deben ser compatibles (ninguna entrada irá más allá de eso)
- El valor con formato decimal debe ser una representación exacta (simplemente lo suficientemente cerca como para garantizar una vuelta correcta de punta redonda al flotador no es lo suficientemente bueno)
- No confiamos en que las funciones de formato de punto flotante de la biblioteca estándar sean lo suficientemente correctas ni lo suficientemente rápidas (por ejemplo:)
printf
, y por lo tanto no se pueden usar. Debes hacer el formateo. Se permiten funciones integrales de formato / conversión. - Puede que no haya ceros iniciales o finales, excepto el cero inicial requerido delante de
.
si no hay un componente de número entero - Se permite una función o un programa completo.
Ejemplos:
1 -2 => 0.25
17 -3 => 2.125
-123 11 => -251904
17 50 => 19140298416324608
23 -13 => 0.0028076171875
3 120 => 3987683987354747618711421180841033728
3 -50 => 0.00000000000000266453525910037569701671600341796875
-3 -50 => -0.00000000000000266453525910037569701671600341796875
10 -2 => 2.5
-12345 -3 => -1543.125
0 0 => 0
161 -4 => 10.0625
512 -3 => 64
El código más corto gana.
fuente
.0
?0.abc
no es un cero inicial, entoncesabc.0
no es uno posterior..0
números enteros cuando se trata de números de coma flotante. Ver por ejemplo Python:str(1.0) == '1.0'
versusstr(1) == '1'
. Tu lógica sigue siendo inconsistente.Respuestas:
CJam, 43
Pruébalo en línea
Explicación:
El programa funciona con exponentes de hasta ± 999, cerca de la precisión doble (64 bits). Separa el signo menos (si está presente) del significado, lo multiplica por 10 999 y luego cambia un poco con el exponente, que ahora es un cálculo exacto. Luego se rellena a la izquierda con ceros si el resultado tiene menos de 1000 dígitos, separa los últimos 999 dígitos como la parte fraccionaria, elimina los ceros finales al convertir su reverso en entero, agrega un punto decimal si es necesario y vuelve a unir todo.
Al final, el signo menos (si lo hay) y la cadena final se imprimen automáticamente juntos.
fuente
CJam, 50 bytes
Este es un programa completo que lee desde STDIN. Pruébelo en línea en el intérprete de CJam .
Verifique todos los casos de prueba a la vez.
fuente
GNU sed + dc, 65
La puntuación incluye +1 para la
-r
opción de sed .Tuve la tentación de reclamar esta
dc
única respuestaC8k& 2r^*p
por un puntaje de 10, perodc
tiene algunas peculiaridades de formato:_
lugar de-
|n| < 1
debe agregarse 0 paraEntonces, la expresión dc se envuelve y se evade
sed
para encargarse de lo anterior.Prueba de salida:
fuente
dc
eso viola mi regla sobre el uso de una función de formato estándar.dc
está bien, dado que "se permite la aritmética de precisión fija ilimitada o alta" .dc
Elp
comando no es una " función de formato de punto flotante" , es una función de impresión de precisión arbitraria. Estoy configurando la precisión a 128 decimales (C8k
), lo que creo que es más que suficiente para cualquier flotante de 32 bits.