Эмулируем сопроцессор через школокалькулятор с обратной польской записью
Не хочется спускать на тормозах срач из Есть ли современный аналог DDD? (да и тупняк в /dev подзапарил).
В тред кастуются mv, xiomar_georgios и все желающие.
Чтобы дать хоть какой-то (мизерный) шанс общелиспу, предлагаю следующую задачу:
«Эмулируем сопроцессор через школокалькулятор с обратной польской записью».
Дано:
На вход подаётся файл фиксированного размера, содержащего дерево двоичных операторов и их операндов. Операнды представлены как 32-битные значения с плавающей точкой (float), операторы - как двоичные константы такой же размерности, что и операнды, эндианнесность - нативная. Операторы состоят из множества («сложить», «вычесть», «умножить»). (Делить не будем во избежание нуля).
На выход - записываем итоговый результат вычислений в любом (хоть двоичном дампе в файл) виде.
В отношении входящих данных гарантируется их корректность.
Пример входных данных в буквенном псевдокоде:
[-] [+] [0.2][0.1][*] [0.3][0.4]
каждое значение обозначено квадратными скобками и занимает 32 бита, запись выше означает выражение ((0,2 + 0,1) - (0,3 * 0,4)).
Ограничений на объём потребляемой памяти и размер стэка нет. Эталонная архитектура - amd64.
Победителем признаётся та реализация, которая будет уделывать конкурентов в лоскуты на гигабайтном входном файле, с минимальной параметризацией на смену типа под double и 32/64-ех битное беззнаковое целое. При смене типа операнда размерность оператора так же меняется!
Итоговые весы выглядят так:
0,4 * разница в double
0,2 * разница в float
0,2 * разница в uint32_t
0,2 * разница в uint64_t
Пример расчёта:
А обгоняет Б в два раза на целочисленных операциях, сливает вдвое на double и поровну на float.
А к Б : 0,4 * 0,5 + 0,2 * 1,0 + 0,2 * 2,0 + 0,2 * 2,0 = 1,2
Б к А : 0,4 * 2 + 0,2 * 1,0 + 0,2 * 0,5 + 0,2 * 0,5 = 1,2
Реализации эквиваленты, ничья.
Адепты раста, хаскеля и похапе, включая суровых сибирских разработчиков на VBA так же приглашаются к участию.
P.S. Так и знал, что в чём-нить обосрусь.
Считаем, что двоичные значения операторов не принадлежат множеству допустимых значений операндов. Для плавающих [+,-,*] = [&infin, -&infin, NaN], для беззнаковых целых - (UINTN_MAX, UINTN_MAX-1, UINTN_MAX-2).