Twoje zadanie jest dość proste. Biorąc pod uwagę dwa zmiennoprzecinkowe, bitowo x lub ich reprezentację binarną, i wysyłaj jako zmiennoprzecinkowe.
Na przykład,
Normal: 16.7472 ^ 123.61 = 7.13402e-37
Binary: 01000001100001011111101001000100 ^ 01000010111101110011100001010010 = 00000011011100101100001000010110
Normal: 2.2 ^ 4.4 = 1.17549e-38
Binary: 01000000000011001100110011001101 ^ 01000000100011001100110011001101 = 00000000100000000000000000000000
Normal: 7.898 ^ 3.4444 = 1.47705e-38
Binary: 01000000111111001011110001101010 ^ 01000000010111000110101001111111 = 00000000101000001101011000010101
Ograniczenia / wyjaśnienia:
- Wejścia / wyjścia można podać dowolną dogodną metodą .
- Program może być pełnym programem lub tylko funkcją; albo jedno jest w porządku.
- Typ float może mieć dowolny rozmiar, ale minimalny rozmiar to 2 bajty.
- Standardowe luki są zabronione.
- Najkrótszy kod wygrywa.
code-golf
bitwise
floating-point
virchau13
źródło
źródło
Odpowiedzi:
kod maszynowy x86-64, 4 bajty
W montażu:
Jest to wywoływalna funkcja, która przyjmuje dwa zmiennoprzecinkowe lub podwajające się argumenty (in
xmm0
ixmm1
) i zwraca zmiennoprzecinkowe lub double (inxmm0
).Jest to zgodne z konwencjami wywoływania zarówno Windows x64, jak i x86-64 SysV ABI, i działa zarówno dla liczb zmiennoprzecinkowych, jak i podwójnych. (Są przekazywane / zwracane w niskich 4 lub 8 bajtach rejestrów XMM).
źródło
C ++ (gcc) ,
7432 bajtyWypróbuj online!
Nie grałem wcześniej w C ++, więc jestem wdzięczny wszystkim, którzy pomogli zmniejszyć rozmiar kodu o połowę! Makro, które przejmuje wskaźniki do dwóch liczb zmiennoprzecinkowych jako argumenty i zmodyfikowało pierwsze, aby zwrócić wynik.
Dzięki @ 12Me1 za uratowanie 2 bajtów i @Arnauld za uratowanie 4! Dzięki @Nishioka za uratowanie kolejnych 14, @Neil kolejne 6, a @AZTECCO i @Nishioka kolejne 11! Dzięki @PeterCordes za zapisanie 5 bajtów!
źródło
z=*(int*)x^*(int*)y;
.#define f(x,y)({int z=*(int*)x^*(int*)y;*(float*)&z;})
(*(int*)x^=*(int*)y)
.#define f(x,y)({*(int*)x^=*(int*)y;*(float*)x;})
Kod maszynowy ARM Thumb,
64 bajtów48 40 70 47
W montażu:
Zgodnie ze standardową konwencją wywoływania uzbrojenia pierwsze dwa parametry są przekazywane do rejestrów R0 i R1, wyniki są zwracane w R0, a LR przechowuje adres zwrotny. Zakładając, że używasz miękkiego pływaka ABI z 32-bitowymi pływakami, wykona on pożądaną operację w 4 bajtach.
-2 bajty dzięki Cody Grayowi
źródło
EORS r0, r1
zamiast tego można by użyć do zapisania 2 bajtów? To tylko 2-bajtowa instrukcja (48 40
) w porównaniu do 4-bajtowejEOR
. Celujesz już w Thumb, więc, o ile mi wiadomo, to powinno działać dobrze. Jedyną różnicą jest to, że aktualizuje flagi stanu, ale w tym przypadku nie obchodzi Cię ten efekt uboczny.s0
is1
.Python 3 + numpy,
7559 bajtówWypróbuj online!
Definiuje lambda, która przyjmuje dwie tablice float32 numpy jako argumenty i zwraca tablicę float32 numpy.
Dzięki @ShadowRanger za zapisanie 14 bajtów, a Joel kolejne 2!
Jeśli import może zostać porzucony (ponieważ moja lambda sama wywołuje metody na obiektach numpy zamiast jakichkolwiek podstawowych funkcji numpy), mógłbym zapisać kolejne 13 bajtów. Nie jestem tego pewien od standardowych zasad golfa.
źródło
numpy.float32
, abyś mógł użyć ich metod) i zastępując obaint32
zastosowania'i'
ifloat32
użycie'f'
;dtype
parametr może być ciągiem znaków, który zostaje przekształcony na prawdziwedtype
dla ciebie, i wygodnie,'i'
i'f'
są legalne sposoby, aby te dtypes, co eliminuje potrzebę funkcji do importowanianumpy
rzeczy do swojej przestrzeni nazw w ogóle. Nie jestem pewien, czy Code Golf może usunąć import, ale nadal przyjmujenumpy
dane wejściowe ...f
int32
do'i'
, cztery zfloat32
do'f'
), ale to wciąż coś. Jeśli import jest ściśle wymagany, możesz go po prostu zmienić,import numpy
aby potwierdzić, że pakiet istnieje, bezfrom numpy import*
konieczności wyodrębniania z niego nazw. To da ci kolejne sześć bajtów, łącznie do 61 bajtów.Galaretka + numpy,
8977 bajtówWypróbuj online!
Ma wątpliwy zaszczyt bycia dłuższym niż kod, który odtwarza w Pythonie 3, głównie ze względu na potrzebę konwersji na / z obiektu numpy i faktu, że Jelly nie jest ładowany przez Jelly, więc
__import__()
należy użyć wbudowanego.Monadyczny link przyjmujący oba argumenty jako listę jako argument i zwracający liczbę zmiennoprzecinkową.
Ocenia następujący kod Python 3:
gdzie
x
iy
są podstawione przez dane wejściowe.źródło
APL (Dyalog Unicode) , 14 bajtów SBCS
Pełny program Monity o 1-kolumnową macierz dwóch 64-bitowych liczb zmiennoprzecinkowych IEEE 754 (binary64) ze standardowego wejścia. Drukuje jeden taki numer na standardowe wyjście.
Wypróbuj online!
⎕
monit (liczby, które zwinięte są na zmiennoprzecinkowe, można zmusić do przekształcenia w zmiennoprzecinkowe za pomocą funkcji⊃⊢⎕DR⍨645,⍨⎕DR
)11⎕DR
konwertuj na 1-bitowy plik binarny (1) D ata R reprezentacja (macierz 2-rzędowa, 64-kolumnowa)≠⌿
pionowa redukcja XOR645⎕DR
konwertuj na 64-bitową liczbę zmiennoprzecinkową (5) D ata R eprezentacja (pojedynczy numer)źródło
VAX BASIC (później VMS BASIC, następnie Compaq Basic) , 11 bajtów
Wydaje mi się to trochę głupie, oczywiście, starsze języki poradzą sobie lepiej, ponieważ nie martwią się tak bardzo o problemy z pisaniem na maszynie.
źródło
Oktawa , 59 bajtów
Wypróbuj online!
Typecast to metoda rzutowania MATLAB / Octave bez zmiany podstawowych bitów. Jest to wymagane, ponieważ
bitxor
działa tylko na liczbach całkowitych. Nie mam pojęcia, dlaczego nigdy nie zaimplementowali liczb zmiennoprzecinkowych, nawet jeśli możesz jawnie podaćAssumedType
trzeci argumentbitxor
. Chyba jedynym zastosowaniem jest programowanie rekreacyjne.źródło
exp()
implementacji. Ale zakładam, że Octave ma już funkcje / operatory do copysign i negacji. I nie dbają o mikrooptymalizacje, takie jak użycie AND (ze stałą maską), a następnie XOR, aby warunkowo odwrócić znak jednej wartości na podstawie znaku innej. W prawdziwym projekcie optymalizacyjnym w asm (właściwie C z wewnętrznymi elementami AVX) użyłem XOR pływaków, a następnie patrzyłem na bit znaku, aby uniknąć cmp w stosunku do zera.C # (interaktywny kompilator Visual C #) , 92 bajty
Wypróbuj online!
źródło
Perl 5
-p
,3127 bajtów-4 bajty dzięki Grimy
Wypróbuj online!
źródło
MATL , 10 bajtów
Wypróbuj online!
Podział z
Z}
był krótszy niż wzięcie dwóch danych wejściowych,4Z%]
źródło
C, 23 bajty
Wypróbuj online!
To może być nieco zmienne; przyjmuje wskaźniki do
float
s jako wskaźniki doint
s.Jednak to działa (w końcu jest to C).
Wykorzystuje to akceptowalne dane wejściowe, biorąc wskaźnik do zmiennej i modyfikując ją w miejscu. Żadna (użyteczna) wartość nie jest zwracana.
źródło
JavaScript (Node.js) ,
105101 bajtówKrótsza wersja węzła sugerowana przez @Neil
Zaoszczędź 4 bajty dzięki @ShieruAsakoto
Pobiera dane wejściowe jako
(x)(y)
.Wypróbuj online!
JavaScript (ES6), 115 bajtów
Pobiera dane wejściowe jako tablicę 2 liczb zmiennoprzecinkowych.
Wypróbuj online!
źródło
Buffer
oszczędza kilka bajtów:a=>(v=new Buffer(4),[x,y]=a.map(n=>v.writeFloatLE(n)&&v.readInt32LE()),v.writeInt32LE(x^y),v.readFloatLE())
.map
)new
innew Buffer(4)
powinny również działać IIRCWolfram Mathematica , 50 bajtów
Chociaż mocno podejrzewam, że może to być bardziej gra w golfa, dwa dodatkowe argumenty
RealDigits
funkcjonalne wydają się konieczne do uzyskania poprawnego wyniku.Wypróbuj online!
źródło
Lua , 73 bajty
Wypróbuj online!
Ten kod zakłada 4-bajtowe liczby całkowite bez znaku i zmiennoprzecinkowe, na których konfiguracja jest włączona
tio.run
. Uruchom jako pełny program z danymi wejściowymi jako argumentami.źródło
Rubinowy ,
7867 bajtów-11 bajtów dzięki @grawity.
Wypróbuj online!
Dane wejściowe to tablica dwóch liczb zmiennoprzecinkowych.
źródło
x.map{|v|[v].pack(?g).unpack(?N)[0]}
⇒x.pack("gg").unpack("NN")
Java (JDK) ,
10976 bajtówWypróbuj online!
Minęło trochę czasu, odkąd grałem w Javę i nie jestem pewien, czy potrzebuję deklaracji na LHS jako części liczby bajtów? Gdyby użył DoubleBinaryOperator, LHS byłby krótszy, ale RHS musiałby użyć Double.doubleToLongBits i Double.longBitsToDouble, więc to faktycznie dłużej.
Dzięki Neil za znaczne oszczędności w liczbie bajtów!
źródło
Czysty , 36 bajtów
Wypróbuj online!
Na szczęście
Real
iInt
typy mają te same rozmiary na platformach 64-bitowych ...Niestety wymaga pełnego podpisu, w przeciwnym razie wykres zamieni się w precla i wszystko się nie powiedzie.
źródło