2017-03-10 6 views
38

자바 인증을 위해 공부하고 있습니다. 그리고 자바 리터럴에 대해 궁금합니다. 나는 이런 식으로 뭔가 할 수 있습니다 알고자바 16 진법 기본 더블 리터럴

int i = 0xAA; 
long l = 0xAAL; 

또한이 부동 소수점 변수 수 있습니다 : 그래서 논리적으로 동일한 16 진수를 신청할 것이라고이 예제를 생각

double d = 123d; 
float f = 123f; 

을 . 긴 리터럴에 대해 L을 추가 할 수있는 것처럼 'd'또는 'f'를 추가 할 수 있지만 'F'및 'D'는 유효한 16 진수 값이므로 논리에 결함이 있습니다.

double d = 0xAAAAAAAAAAAAAAAAAAd; 

그냥 자바 허용하지 않는이 아니면 내가 모르는 그것을 할 수있는 간단한 방법이있다 :

이 같은 것을 할 수 없습니다?

+0

IEEE-754 부동 소수점 형식을 알고 있습니까? Java 언어 참조 문서를 공부 했습니까? '0xaaaaaaaaaaaaaaaa '의 부동 소수점 값은 무엇입니까? –

+5

@ 짐 가리슨 (JimGarrison) : OP는 "불가능합니다"라고 말하면서 그들이 실제로 시도해 본 결과 오류가 있음을 나타냅니다. 내가 질문에 대답하기 시작할 때까지 자바에서 부동 소수점 리터럴을 직접 알지 못했습니다. –

+0

@JonSkeet that 's interesting .... –

답변

57

입니다. 그게 놀랍지 만. Section 3.10.2 of the JLSHexadecimalFloatingPointLiteral을 포함하여 부동 소수점 리터럴의 구조를 제공합니다.

public class Test { 

    public static void main(String[] args) { 
     double d1 = 0xAAAAAAAAAAAAAAAAAAp0d; 
     double d2 = 0x1.8p1d; 

     System.out.println(d1); // A very big number 
     System.out.println(d2); // 24 = 1.5 * 2^1 
    } 
} 

p는 이진 지수의 일부로서 요구되는 경우 - p 후의 값은 좌측의 값을 시프트 비트 수이다. 다른 예 :

0x1.4p0d => 1.25 (binary 0.01 shifted 0 bits) 
0x8p-4d => 0.5 (binary 1000 shifted *right* 4 bits) 
+0

그것은 읽기가 어려운 글자로 밝혀졌지만 실제로 가능합니다! –

+4

C에는 C99에 추가 된 유사한 구문의 16 진수 부동 소수점 상수가 있습니다. –

+2

@KeithThompson - 그렇습니다. 구문은 원래 C99 AFAICT에 채택 된 다음 C-family의 다른 언어뿐만 아니라 Python 및 다른 언어로 마이그레이션되었습니다. (bitwise-exact FP 값이 필요한 저수준 수치 코드에서 유용합니다.) – LThode