2010-04-28 3 views
20

Java에서 float 프리미티브의 사용법을 명확히 설명 할 수 있습니까?어떤 목적으로 java는 float 기본 유형을 갖고 있습니까?

제 생각에는 float 값을 double로 또는 그 반대로 변환하는 것은 문제가 될 수 있습니다. 나는 float의 성능이 double보다 훨씬 더 나빴다는 것을 (오랜 시간 전에, 새로운 JVM으로는 더 이상 사실이 아닌지) 읽었다. 물론 float은 double보다 정밀도가 떨어집니다.

AWT와 Swing으로 작업했을 때, Point2D.Float 또는 Point2D.Double 사용과 같은 float 또는 double 사용과 관련하여 몇 가지 문제가 있음을 기억합니다.

그래서, 두 번에 걸쳐 부동의 2 이점을 참조하십시오 더블 필요 8 바이트

  • 자바 메모리 모델 (JMM)이 그 할당 작업은 보장하면서

    1. 그것은 단지 4 바이트를 필요로 원자는 float 변수를 사용하고 원자는 double을 사용하지 않습니다.

    float가 두 배 이상인 경우가 있습니까? 응용 프로그램에서 float를 사용합니까?

  • +4

    "자바가 플로트를 가지고있는 유일한 가치있는 이유는 이전 버전과의 호환성입니다." 이전에'float'의 두 가지 이점을 나열했을 때 이것을 말하면 ... –

    +1

    * Demagogy? * 아마도 그는 더 잘 붙일 수 있었을 것입니다 ("double"대신에'float'을 사용할 때? "), 그러나 demagogy? * – egrunin

    +0

    int의 범위가 넓 으면 int보다 짧은 점은 무엇입니까? 대답은 여기에서 동일합니다. – Malcolm

    답변

    15

    float 유형을 포함하는 이유는 역사적으로 어느 정도의 차이입니다. 즉, 반환 값으로 부동 소수점 크기의 4 바이트를 잘라내는 날부터 표준 IEEE 부동 소수점 표현을 나타냅니다 극도로 열악한 정밀도는 가치있는 상반 관계였습니다.

    요즘에는 float에 대한 사용이 제한되어 있습니다. 그러나 예를 들어 데이터 형식을 사용하면 float를 사용하는 이전 시스템과의 상호 운용성이 필요한 코드를 쉽게 작성할 수 있습니다.

    퍼포먼스에 관한 한, float와 double은 본질적으로 과 동일하지만 div30의 성능은 예외입니다 (). 일반적으로 프로세서를 사용하는 경우 프로세서는 내부 형식으로 변환하고 계산 한 다음 다시 변환하며 실제 계산에는 일정 시간이 걸립니다. 부서의 경우 적어도 인텔 프로세서에서 나누기 작업을 수행하는 데 소요되는 시간은 일반적으로 2 비트 정밀도 당 1 클럭 사이클이므로 float 또는 double 사용 여부에 따라 차이가 발생합니다.

    정말 새로운 코드에서 사용하지 않는 한 강력한 이유가 없다면 일반적으로 'float'을 피할 것입니다.

    +2

    인텔 CPU의 경우 내부 표현은 80 비트이고 32 비트 'float'과 64 비트 'double'과는 다릅니다. 따라서 어느 경우에도 전환이 발생합니다. –

    +1

    네, 절대적으로 - 미안 해요. "내가 사용하는 [...] 형식을 내부 형식으로 변환 할 때"라고 말하면 분명하다고 생각했습니다. 그러나 그렇습니다, 완전히 동의합니다. –

    +2

    그리고 MP3의 존재는 어느 정도 역사적입니다. 오디오 파일의 크기를 50-90 % 줄이면 정확도를 떨어 뜨리는 데서 그만한 가치가 있습니다. ** 심각하게 !! ** 4 바이트를 생각하지 말고 50 %를 생각하기 시작하십시오. 수천 시간의 부동 소수점 오디오를 사용하면 32 비트가 정밀도가 높아지고 정밀도를 높이기 위해 저장 공간 크기를 두 배로 늘리면 쓸모가 없습니다. 단일 변수가 아닌 배열을 생각하십시오! –

    7

    방금 ​​준 두 가지 이유가 매우 큽니다.

    1k x 1kx64 크기의 3D 볼륨이 있고 해당 데이터의 타임 포인트가 많이있는 경우 최대 강도 투영의 동영상을 만들고 싶으면 float이 double 크기의 절반 인 사실을 당신이 기억이 다 떨어지기 때문에 빨리 끝내는 것과 쓰러 뜨리기 사이의 차이.

    원자력은 스레드 관점에서 보면 거대합니다.

    속도/성능과 정확도 사이에는 항상 상반 관계가 있습니다. 2^31보다 작은 숫자와 정수가있는 경우 정수는 부동 소수점 숫자보다 항상 더 정확합니다. 정밀도가 떨어지기 때문입니다. 당신은 당신의 필요를 평가하고 당신의 문제에 대해 적절한 유형을 사용해야합니다.

    2

    그래서 예, 수레의 장점 :

    1. 만 4 바이트를 필요로
    2. 원자 할당
    3. 특정 플로트 바이트 코드가 있기 때문에 산술, 특히 32 비트 아키텍처를 빨리해야한다. 복식를 사용하는 경우

    방법은 다음을 완화하기 :

    1. 더 많은 RAM을 구입, 정말 싸다.
    2. 원자 할당이 필요한 경우 휘발성 복식을 사용하십시오.
    3. 테스트를 수행하고 각각의 성능을 확인하십시오. 실제로 속도가 빠르면 수행 할 수있는 작업이 많지 않습니다.

    누군가는 이것이 짧은 대 int 인수와 비슷하지만 그렇지 않은 것으로 언급했습니다. long를 제외한 모든 정수 유형 (부울 포함)은 배열에 저장되지 않는 한 Java 메모리 모델에 4 바이트 정수로 저장됩니다.

    +1

    필드로서 정수형은 모두 4 바이트를 사용하지만 배열로 저장할 때는 그렇지 않습니다. 예 : short []는 인덱스 당 2 바이트를 차지합니다. – mdma

    +0

    네, 맞습니다. (실제로는 두 개의 슬롯에 저장됩니다. – Geoff

    3

    플로트가 절반 크기 인 스토리지를 언급 ​​할 때 당신이 그것을 못 박았을 것 같습니다.

    부동 소수점을 사용하면 메모리 대역폭이 제한 요소가되도록 부동 소수점 숫자 배열을 처리하는 응용 프로그램의 성능이 두 배보다 향상 될 수 있습니다. float[]에서 double[]으로 전환하고 데이터 크기를 절반으로 줄이면 주어진 시간에 두 배의 값을 가져올 수 있기 때문에 처리량을 효과적으로 배가시킵니다. cpu가 float을 double로 변환하는 작업이 조금 더 있지만이 작업은 메모리 가져 오기와 병행하여 수행되며 반입에는 더 오래 걸립니다.

    일부 응용 프로그램의 경우 정밀도가 떨어지면 성능 향상을 위해 거래 가치가있을 수 있습니다. 그럼 다시 ...--)

    2

    두 배로 증가하는 경우가 종종 있습니다. 그러나이를 위해서는 L1 캐시에 모든 것이 들어 맞아야합니다. 부동 소수점을 사용하면 캐시 라인에서 두 배나 더 많이 가질 수 있습니다. 이로 인해 일부 프로그램이 거의 두 배 빠르게 실행될 수 있습니다.

    SSE 명령어는 2 대신 병렬로 4 개의 부동 소수점을 사용할 수도 있지만 JIT가 실제로 사용하는 명령어인지는 의심 스럽습니다. 나는 틀린 것일지도 모른다.

    관련 문제