(Na razie oznaczyłem pytanie „C”, ale jeśli znasz inny język, który obsługuje związki, możesz go również użyć).
Twoim zadaniem jest zbudowanie czterech standardowych operatorów matematycznych + - * /
dla następującej struktury:
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;}
}
tak, że same operacje zawsze manipulują lub uzyskują dostęp do części całkowitej (więc nie można porównywać z podwójną w dowolnym momencie podczas operacji), a wynik jest dokładnie taki sam (lub funkcjonalnie równoważny, w przypadku wyników nienumerycznych, takich jak NaN
) jakby double
zamiast tego zastosowano odpowiednią operację matematyczną .
Możesz wybrać, którą częścią całkowitą chcesz manipulować, być może nawet używając różnych spośród różnych operatorów. (Możesz także usunąć „niepodpisany” z dowolnego pola w unii, chociaż nie jestem pewien, czy chcesz to zrobić.)
Twój wynik to suma długości kodu w znakach dla każdego z czterech operatorów. Najniższy wynik wygrywa.
Dla tych z nas znają specyfikacji IEEE 754, tutaj jest artykuł o nim na Wikipedii.
Edycje:
03-06 08:47 Dodano konstruktory do struktury intfloat. Możesz używać ich do testowania, zamiast ręcznego ustawiania podwójnego / itp.
źródło
intstruct
w kategoriachuint8_8
,uint16_t
i tak dalej jako absolutnych rozmiarówshort
,int
a więc nie są określone przez normę (każdy typ ma wielkość minimalną i istnieje ścisła kolejność pod względem wielkości, ale Otóż to).Odpowiedzi:
C ++, ~ 1500 znaków
Rozwija liczby zmiennoprzecinkowe do reprezentacji stałoprzecinkowej o 8 000 cyfrach binarnych, wykonuje na tym operacje, a następnie dokonuje konwersji.
Jestem zbyt leniwy, aby usunąć wszystkie spacje i znaki nowej linii, aby uzyskać dokładną liczbę w golfa, ale jest to około 1500 znaków.
źródło