(Por el momento he etiquetado la pregunta "C", pero si conoce otro lenguaje que admita los sindicatos, también puede usarlo).
Su tarea es construir los cuatro operadores matemáticos estándar + - * /
para la siguiente estructura:
union intfloat{
double f;
uint8_t h[8];
uint16_t i[4];
uint32_t j[2];
uint64_t k;
intfloat(double g){f = g;}
intfloat(){k = 0;}
}
de modo que las operaciones en sí mismas solo manipulen o accedan a la parte entera (por lo que tampoco se compara con el doble en cualquier momento durante la operación), y el resultado es exactamente el mismo (o funcionalmente equivalente, en el caso de resultados no numéricos como NaN
) como si la operación matemática correspondiente se hubiera aplicado directamente al double
lugar.
Puede elegir qué parte entera manipular, tal vez incluso usando diferentes entre diferentes operadores. (También puede optar por eliminar el "sin firmar" de cualquiera de los campos de la unión, aunque no estoy seguro de si desea hacer eso).
Su puntaje es la suma de la longitud del código en caracteres para cada uno de los cuatro operadores. La puntuación más baja gana.
Para aquellos de nosotros que no estamos familiarizados con la especificación IEEE 754, aquí hay un artículo al respecto en Wikipedia.
Ediciones:
06/03 08:47 Se agregaron constructores a la estructura intfloat. Puede usarlos para probar, en lugar de configurar manualmente el doble / etc.
fuente
intstruct
en términos deuint8_8
,uint16_t
etc., ya que los tamaños absolutos deshort
,int
y así sucesivamente, no están definidos por el estándar (cada tipo tiene un tamaño mínimo y hay un orden estricto de tamaño, pero Eso es).Respuestas:
C ++, ~ 1500 caracteres
Expande los flotadores en una representación de punto fijo de 8000 dígitos binarios, realiza las operaciones sobre eso y luego los vuelve a convertir.
Soy demasiado vago para eliminar todos los espacios y líneas nuevas para obtener un conteo exacto de golf, pero son aproximadamente 1500 caracteres.
fuente