부동 소수점 XOR


15

당신의 작업은 매우 간단합니다. 두 개의 부동 소수점이 있으면 비트 x 또는 이진 표현을 부동 소수점으로 출력합니다.

예를 들어

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

제한 / 설명 :

  • 입 / 출력은 편리한 방법 으로 제공 할 수 있습니다 .
  • 프로그램은 전체 프로그램이거나 기능 일 수 있습니다. 어느 쪽이든 괜찮습니다.
  • float 유형은 모든 크기가 될 수 있지만 최소 크기는 2 바이트입니다.
  • 표준 허점은 금지되어 있습니다.
  • 가장 짧은 코드가 승리합니다.

2
부울 목록은 편리한 방법으로 간주됩니까?
Adám

23
플로트의 "이진 표현"은 매우 모호합니다. 사용중인 표현을 정의해야합니다. 이 행성에서 생명체가 이미 사용하고있는 유한 수를 포함하여 무한한 수의 표현이 있습니다. 일부는 IEEE 754와 같은 다른 것보다 더 유명합니다.
Reversed Engineer

7
이 질문은 "xor the representations"보다는 "xor the values " 로 더 흥미로울 것 입니다. 후자는 타입 시스템이 없거나 타입 punning을 허용하는 언어에서 "xor 2 개의 32 비트 정수"와 동일하다. 따라서 꽤 지루하다 ...
R .. GitHub STOP HELPING ICE

5
입력 또는 출력으로 무한대, 하위 법선 또는 음수 0을 처리해야합니까?
Grimmy

3
@Mark : 아니요, 작성된 질문은 해당 표현이 무엇이든 관계없이 표현을 조정하는 것입니다. 결과는 부동 소수점 형식에 따라 달라 지지만 알고리즘은 항상 표현에 대한 단일 xor 명령어이므로 매우 지루합니다.
R .. GitHub 중지 지원 얼음

답변:


53

x86-64 머신 코드, 4 바이트

0f 57 c1 c3

조립시 :

xorps xmm0, xmm1
ret

두 개의 float 또는 double을 인수 (in xmm0xmm1)로 사용하고 float 또는 double (in xmm0)을 반환 하는 호출 가능 함수입니다 .

이는 Windows x64 x86-64 SysV ABI 의 호출 규칙과 일치하며 float뿐만 아니라 double에도 작동합니다. (XMM 레지스터의 하위 4 또는 8 바이트로 전달 / 반환됩니다).


12

C ++ (gcc) , 74 32 바이트

#define f(x,y)*(int*)x^=*(int*)y

온라인으로 사용해보십시오!

나는 이전에 C ++에서 골프를 치지 않았으므로 코드 크기를 절반으로 줄이는 데 도움을 주신 모든 사람들에게 감사드립니다! 두 개의 부동 소수점에 대한 포인터를 인수로 사용하고 첫 번째를 수정하여 결과를 반환하는 매크로입니다.

2 바이트를 저장하는 @ 12Me1과 4를 저장하는 @Arnauld에 감사합니다! 또 다른 14 개를 저장 한 @Nishioka, @Neil 추가 6, @AZTECCO 및 @Nishioka 추가 11에 감사드립니다! 5 바이트를 절약 한 @PeterCordes에게 감사합니다!


1
당신은이 개 문자를 저장하기 위해 줄 바꿈을 제거 할 수 있습니다,이 또한 C에서 작동
12Me21

1
로 4 바이트를 더 절약 할 수 있습니다 z=*(int*)x^*(int*)y;.
Arnauld

1
gcc 확장을 사용하면 54 바이트 :#define f(x,y)({int z=*(int*)x^*(int*)y;*(float*)&z;})
Nishioka

2
포인터를 사용하고 있으므로 입력 중 하나를 출력으로 사용하는 것이 합법적입니까? 그렇다면을 쓸 수 (*(int*)x^=*(int*)y)있습니다.

1
@Neil의 제안을 고려하면 48 바이트가됩니다.#define f(x,y)({*(int*)x^=*(int*)y;*(float*)x;})
Nishioka

9

ARM Thumb 머신 코드, 6 4 바이트

48 40 70 47

조립시 :

EORS R0, R1; 독점 또는 처음 두 매개 변수 중 결과를 반환 레지스터에 저장
BX LR; 링크 레지스터에 저장된 값으로 분기 (반환 주소)

표준 Arm 호출 규칙에 따라 처음 두 매개 변수는 레지스터 R0 및 R1에 전달되고 결과는 R0에 리턴되며 LR은 리턴 주소를 보유합니다. 32 비트 부동 소수점이있는 소프트 부동 ABI를 사용한다고 가정하면 4 바이트 단위로 원하는 작업을 수행합니다.

Cody Gray 덕분에 -2 바이트


2
EORS r0, r12 바이트를 절약하기 위해 대신 사용할 수 있습니까? 48 404 바이트와 비교할 때 2 바이트 명령 ( ) EOR입니다. 이미 Thumb을 타겟팅하고 있으므로 가능한 한 잘 작동합니다. 유일한 차이점은 상태 플래그를 업데이트하지만이 경우 부작용에 대해서는 신경 쓰지 않는다는 것입니다.
Cody Grey

2
VFP / NEON s0s1.가 아닌 정수 레지스터에서 FP 인수를 전달하는 소프트 플로트 ABI를 사용하도록 지정해야합니다 .
Peter Cordes

6

파이썬 3 + numpy, 75 59 바이트

lambda x,y:(x.view("i")^y.view("i")).view("f")
import numpy

온라인으로 사용해보십시오!

두 개의 numpy float32 배열을 인수로 사용하고 numpy float32 배열을 반환하는 람다를 정의합니다.

14 바이트를 절약 해 준 @ShadowRanger와 Joel에게 2 더 감사합니다!

내 람다 자체가 기본 numpy 함수가 아닌 numpy 객체에서 메소드를 호출하기 때문에 가져 오기를 삭제할 수 있다면 13 바이트를 더 절약 할 수 있습니다. 코드 골프 표준 규칙에 대해서는 확실하지 않습니다.


Jelly와 Ruby의 답변보다 짧습니다. 좋은!
Eric Duminil

당신은 완전히 가져 오기를 제거하여 27 바이트 (48 바이트에 낙하) 면도 할 수 있습니다 (다만 발신자가 전달 된 가정 numpy.float32모두 교체 당신이 그들의 방법을 사용할 수 있도록 S) int32로 사용 'i'하고 float32와 사용을 'f'; dtype매개 변수는 실제로 변환됩니다 문자열이 될 수 있습니다 dtype당신을 위해, 편리하게, 'i'그리고 'f'수입에 기능에 대한 필요성 제거하는 dtypes 만들 수있는 법적 방법입니다 numpy모두에서 네임 스페이스에 물건을. 가져 오기를 제거하는 것이 합법적이지만 여전히 numpy입력을 가정하는 것이 Code Golf인지 확실하지 않습니다 ...
ShadowRanger


수입품이 포함되어야한다고 생각했지만 확실하지 않습니다. 팁 다시 dtypes 주셔서 감사합니다!
Nick Kennedy

@NickKennedy는 : 수입이 필요한 경우 그래, 그것은 단지 8 바이트 (두 각 저장 int32'i',에서 4 float32까지를 'f')하지만 여전히 뭔가. 가져 오기가 꼭 필요한 경우에는 이름을 추출 import numpy하지 않고 패키지가 존재하도록 변경하기 만하면 from numpy import*됩니다. 그러면 6 바이트가 61 바이트로 줄어 듭니다.
ShadowRanger

6

젤리 + numpy, 89 77 바이트

“(F(“I^F(“IvF).item()”;"F“¢lẒṾ:/²)Ɓɱ¡vẠ⁷5Rʠ¡7ɼṆṪ{ė4¶Gẉn`¡Ð}ṫȥṄo{b»Ḳ¤¹ṣḢ}jʋƒŒV

온라인으로 사용해보십시오!

numpy 객체로 /로부터 변환해야 할 필요성과 numpy가 Jelly에 의해로드되지 않았기 때문에 __import__()내장 기능을 사용해야한다는 사실 때문에 복제 된 Python 3 코드보다 길다는 의심이 있습니다.

두 개의 수레를 인수로 목록으로 사용하고 부동 수를 리턴하는 모나드 링크

다음 Python 3 코드를 평가합니다.

(__import__('numpy').float32(x).view("i")^__import__('numpy').float32(y).view("i")).view(__import__('numpy').float32).item()

어디서 x그리고 y입력으로 대체됩니다.


5

APL (Dyalog Unicode) , 14 바이트 SBCS

전체 프로그램. stdin에서 2 개의 IEEE 754 64 비트 부동 소수점 숫자 (binary64)로 구성된 1 열 행렬을 프롬프트합니다. 그러한 숫자 중 하나를 stdout에 인쇄합니다.

645DR≠⌿11DR

온라인으로 사용해보십시오!

 프롬프트 (부동하지 않는 숫자는 함수를 사용하여 부동으로 강제 수 있습니다 ⊃⊢⎕DR⍨645,⍨⎕DR)

11⎕DR 1 비트 이진 (1)로 변환하는 D ATA R epresentation (2 행 64 열의 매트릭스)

≠⌿ 수직 XOR 감소

645⎕DR 64 비트 부동 소수점으로 변환 (5) D ATA R epresentation (단수)


4

VAX BASIC (나중에 VMS BASIC, Compaq Basic) , 11 바이트

H = F XOR G

나에게 약간 바보 같은 것 같습니다. 분명히 오래된 언어는 강력한 타이핑 문제에 대해 걱정하지 않았기 때문에 더 나아질 것입니다.


1
사이트에 오신 것을 환영합니다. 나는 외부 헤더를 것으로 보인다 무엇을 편집 할 수 있지만 경우에 상관 동반 정보와 함께, 그것은 다시 편집을 무료로 느끼지 한
coinheringaahing 케어 드

3

옥타브 , 59 바이트

@(a,b)(t=@typecast)(bitxor(t(a,u='int32'),t(b,u)),'single')

온라인으로 사용해보십시오!

Typecast는 기본 비트를 변경하지 않고 MATLAB / Octave 캐스팅 방법입니다. bitxor정수에서만 작동 하기 때문에 필수 입니다. 를 AssumedType세 번째 인수로 명시 적으로 지정할 수 있지만 왜 부동 소수점 숫자를 구현하지 않았는지 모르겠습니다 bitxor. 유일하게 레크리에이션 프로그래밍 만 사용하는 것 같습니다.


FP 비트 패턴의 비트 단위는 부호 비트로 작업을 수행하거나 exp()구현의 일부로 지수 필드에 정수를 거의 넣지 않는 어셈블리 언어에서 유용합니다 . 그러나 Octave에는 이미 copysign 및 negation을위한 함수 / 연산자가 있다고 가정합니다. 그리고 AND (상수 마스크 사용)를 사용한 다음 XOR을 사용하여 다른 값의 부호를 기준으로 한 값의 부호를 조건부로 뒤집는 것과 같은 미세 최적화에 대해서는 신경 쓰지 않습니다. asm (실제로 AVX 내장 함수가있는 C)의 실제 최적화 프로젝트에서 float의 XOR을 사용한 다음 부호 비트를보고 0에 대한 cmp를 피했습니다.
Peter Cordes




2

C, 23 바이트

f(int*x,int*y){*x^=*y;}

온라인으로 사용해보십시오!

약간 교대 할 수도 있습니다. floats에 대한 포인터를 s에 대한 포인터로 사용 int합니다.

그러나 작동합니다 (결국 C입니다).

변수에 대한 포인터를 가져 와서 제자리에서 수정하여 수용 가능한 입력을 활용합니다. (사용 가능한) 값이 반환되지 않습니다.


2

자바 스크립트 (Node.js를) ,  (105)  101 바이트

@Neil이 제안한 더 짧은 노드 버전
@Neil이 @ShieruAsakoto 덕분에 4 바이트 더 절약

로 입력을 (x)(y)받습니다.

x=>y=>(v=Buffer(4),v.writeInt32LE((g=n=>v.writeFloatLE(n)&&v.readInt32LE())(x)^g(y)),v.readFloatLE())

온라인으로 사용해보십시오!


자바 스크립트 (ES6), 115 바이트

2 개의 부동 소수점 배열로 입력을받습니다.

a=>(v=new DataView(new ArrayBuffer(4))).getFloat32(v.setUint32([x,y]=a.map(n=>v.getUint32(v.setFloat32(0,n))),x^y))

온라인으로 사용해보십시오!


참고로 노드 Buffer는 몇 바이트를 절약합니다 a=>(v=new Buffer(4),[x,y]=a.map(n=>v.writeFloatLE(n)&&v.readInt32LE()),v.writeInt32LE(x^y),v.readFloatLE()).
Neil

@ 닐 감사합니다! (대신에 함수를 사용하여 2 바이트를 더 절약했습니다 map)
Arnauld

1
낙하 new에있는 것은 new Buffer(4)또한 IIRC 작동합니다
Shieru Asakoto에게




1

자바 (JDK) , 109 76 바이트

(a,b)->Float.intBitsToFloat(Float.floatToIntBits(a)^Float.floatToIntBits(b))

온라인으로 사용해보십시오!

Java에서 골프를 뛴 후 오랜 시간이 지났고 바이트 수의 일부로 LHS에 선언이 필요한지 확실하지 않습니까? DoubleBinaryOperator를 사용하면 LHS는 짧아 지지만 RHS는 Double.doubleToLongBits 및 Double.longBitsToDouble을 사용해야하므로 실제로는 더 길어집니다.

바이트 수를 크게 절약 한 Neil에게 감사드립니다!


1
IIRC 당신은 바이트 수의 일부로 할당이 필요하지 않습니다. 온라인에서 사용해보십시오! 머리글.
Neil

@ 닐 감사합니다! 그것은 큰 차이를 만듭니다!
David Conrad

0

깨끗한 , 36 바이트

f::!Real!Real->Real
f _ _=code{xor%}

온라인으로 사용해보십시오!

고맙게도 RealInt유형은 64 비트 플랫폼에서 동일한 크기입니다 ...
불행히도 완전한 서명이 필요합니다. 그렇지 않으면 그래프가 프레첼로 바뀌고 모든 segfault가됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.