(Я пометил вопрос «C» в настоящее время, но если вам известен другой язык, который поддерживает союзы, вы также можете использовать его.)
Ваша задача - построить четыре стандартных математических оператора + - * /
для следующей структуры:
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;}
}
таким образом, что сами операции всегда когда-либо манипулируют или получают доступ к целочисленной части (поэтому не сравнивать с двойной в любое время во время операции), и результат является точно таким же (или функционально эквивалентным, в случае нечисловых результатов, таких как NaN
) как будто соответствующая математическая операция была применена прямо double
вместо.
Вы можете выбрать, какой целочисленной частью манипулировать, возможно, даже используя разные операторы. (Вы также можете удалить «unsigned» из любого поля объединения, хотя я не уверен, что вы захотите это сделать.)
Ваша оценка - это сумма длины кода в символах для каждого из четырех операторов. Самый низкий балл побеждает.
Для тех из нас, кто не знаком со спецификацией IEEE 754, вот статья об этом в Википедии.
Редактирование:
03-06 08:47 Добавлены конструкторы в структуру intfloat. Вы можете использовать их для тестирования, а не вручную устанавливать двойной / и т. Д.
источник
intstruct
точки зренияuint8_8
,uint16_t
и так далее , как абсолютных размеровshort
,int
и так далее не определены стандартом (каждый тип имеет минимальный размер и существует строгий порядок в размерах, но Это оно).Ответы:
C ++, ~ 1500 символов
Расширяет числа с плавающей точкой в представление с фиксированной запятой из 8000 двоичных чисел, выполняет операции с ними, а затем выполняет обратное преобразование.
Мне лень убирать все пробелы и переводы строк, чтобы получить точное число в гольфе, но это около 1500 символов.
источник