programing

Java에서 플로트 및 이중 데이터 유형

prostudy 2022. 4. 14. 20:43
반응형

Java에서 플로트 및 이중 데이터 유형

플로트 데이터형은 단일정밀 32비트 IEEE 754 부동소수점이고 이중 데이터형은 이중정밀 64비트 IEEE 754 부동소수점이다.

그것은 무엇을 뜻하나요?그리고 내가 언제 이중 혹은 그 반대 대신 플로트를 사용해야 할까?

그 위에 있는 위키피디아 페이지는 시작하기에 좋은 곳이다.

요약하면:

  • float32비트로 표시되며, 1 부호 비트, 8 비트의 지수 및 23 비트의 의미(또는 과학적인 숫자: 2.33728*1012, 33728은 의미)로 표시된다.

  • double64비트로 표시되며, 1 부호 비트, 11 비트의 지수, 52 비트의 의미와 함께 표시된다.

에서는 기기로 자바를 double그것의 부동 소수(따라서 문자 그대로)를 나타내다3.14타이핑되어 있다double더큰하고 싶다 또한 훨씬 더 큰 숫자 범위를 제공하는 데이터 유형이기 때문에, 나는 이 데이터 유형을 사용하는 것을 강력히 권장한다.float.

실제로 사용을 강요하는 특정 라이브러리가 있을 수 있다.float, 그러나 일반적으로 - 당신의 결과가 충분히 적다고 보장할 수 없다면float규정된 범위, 그렇다면 함께 선택하는 것이 가장 좋다.double.

정확성이 필요한 경우 - 예를 들어, 부정확한 십진수 값을 가질 수 없음(예:1/10 + 2/10) 또는 통화(예: 시스템에서 $10.33을 나타내는)를 사용하여 모든 작업을 수행한 다음BigDecimal임의의 정밀도를 지원할 수 있고 그런 상황을 우아하게 다룰 수 있다.

플로트는 당신에게 약 6-7자리의 정밀도를 주는 반면, 더블은 당신에게 약 15-16을 준다.또한 수의 범위는 두 배의 경우 더 크다.

더블은 8바이트의 저장 공간이 필요한 반면 플로트는 4바이트가 필요하다.

실제 숫자로도 알려진 부동 소수점은 부분 정밀도가 필요한 식을 평가할 때 사용된다.예를 들어 제곱근과 같은 계산이나 사인, 코사인 등의 초월성은 정밀도에 부동소수점이 필요한 값이 된다.Java는 부동소수점 유형 및 연산자의 표준 집합(IEEE-754)을 구현한다.부동소수점은 부동소수형과 이중소수형 두 종류가 있는데, 이는 각각 단일정밀수와 이중정밀수를 나타낸다.이들의 폭과 범위는 다음과 같다.


   Name     Width in Bits   Range 
    double  64              1 .7e–308 to 1.7e+308
    float   32              3 .4e–038 to 3.4e+038


둥둥 뜨다

type float는 32비트의 저장을 사용하는 단일정밀값을 지정한다.단일 정밀도는 일부 프로세서에서 더 빠르고 이중 정밀도의 절반의 공간을 차지하지만 값이 매우 크거나 매우 작을 때 부정확해진다.부동 유형의 변수는 부분 성분이 필요할 때 유용하지만 높은 정밀도를 요구하지 않는다.

부동 변수 선언의 예는 다음과 같다.

높낮이, 낮은 온도;


곱절로 하다

이중 정밀도는 이중 키워드로 나타내듯이 64비트를 사용하여 값을 저장한다.이중 정밀도는 실제로 고속 수학 계산에 최적화된 일부 현대 프로세서에서는 단일 정밀도보다 빠르다.sin( ), cos( ), sqrt( )와 같은 모든 초월 수학 함수는 이중 값을 반환한다.많은 반복적인 계산에 대해 정확성을 유지해야 하거나 큰 값을 조작하고 있을 때, 이중성이 최선의 선택이다.

이렇게 하면 오류가 발생함:

public class MyClass {
    public static void main(String args[]) {
        float a = 0.5;
    }
}

/MyClass.java:3: 오류: 호환되지 않는 유형: 더블에서 플로트 a = 0.5로 손실 가능한 변환;

이것은 완벽하게 잘 될 것이다.

public class MyClass {
    public static void main(String args[]) {
        double a = 0.5;
    }
}

이것 또한 완벽하게 잘 될 것이다.

public class MyClass {
    public static void main(String args[]) {
        float a = (float)0.5;
    }
}

이유 : Java는 더 높은 정밀도를 보장하기 위해 기본적으로 실수를 두 배로 저장한다.

이중은 더 많은 공간을 차지하지만 계산 시 더 정확한 공간을 차지하며 플로트는 더 적은 공간이지만 덜 정밀하게 된다.

그럼에도 불구하고 Java는 계산을 위해 더블을 사용하는 것에 대해 편견을 가지고 있는 것 같다.

오늘 앞서 쓴 프로그램을 예로 들자면, 플로트를 사용할 때는 방법이 통하지 않았지만, 플로트를 더블로 교체할 때는 (넷빈즈 IDE에서) 효과가 좋다.

package palettedos;
import java.util.*;

class Palettedos{
    private static Scanner Z = new Scanner(System.in);
    public static final double pi = 3.142;

    public static void main(String[]args){
        Palettedos A = new Palettedos();
        System.out.println("Enter the base and height of the triangle respectively");
        int base = Z.nextInt();
        int height = Z.nextInt();
        System.out.println("Enter the radius of the circle");
        int radius = Z.nextInt();
        System.out.println("Enter the length of the square");
        long length = Z.nextInt();
        double tArea = A.calculateArea(base, height);
        double cArea = A.calculateArea(radius);
        long sqArea = A.calculateArea(length);
        System.out.println("The area of the triangle is\t" + tArea);
        System.out.println("The area of the circle is\t" + cArea);
        System.out.println("The area of the square is\t" + sqArea);
    }

    double calculateArea(int base, int height){
        double triArea = 0.5*base*height;
        return triArea;
    }

    double calculateArea(int radius){
        double circArea = pi*radius*radius;
        return circArea;
    }

    long calculateArea(long length){
        long squaArea = length*length;
        return squaArea;
    }
}

IEEE 표준에 따르면, 플로트는 실수의 32비트 표현이고, 더블은 64비트 표현이다.

Java 프로그램에서 우리는 대개 이중 데이터 유형을 사용한다.단지 이중 데이터 유형을 사용하여 수용할 수 있는 숫자의 범위가 플로트를 사용할 때의 범위보다 더 많기 때문에 오버플로를 피하기 위한 것이다.

또한 높은 정밀도가 요구되는 경우에는 이중의 사용을 권장한다.오래 전에 구현된 라이브러리 방법 중 플로트 데이터 유형을 필수 항목으로 사용해야 하는 것은 거의 없다.

그러나 만약 당신이 당신의 프로그램이 적은 숫자를 필요로 하고 당신이 플로트를 사용했을 때 오버플로가 발생하지 않을 것이라고 확신한다면, 플로트의 사용은 플로트가 2배에서 요구하는 메모리의 절반을 요구하기 때문에 당신의 공간 복잡성을 크게 개선할 것이다.

이 예는 Java의 플로트에서 부호(맨 왼쪽 비트), 지수(맨 아래 비트 8개), 맨티사(맨 오른쪽 비트 23개)를 추출하는 방법을 보여준다.

int bits = Float.floatToIntBits(-0.005f);
int sign = bits >>> 31;
int exp = (bits >>> 23 & ((1 << 8) - 1)) - ((1 << 7) - 1);
int mantissa = bits & ((1 << 23) - 1);
System.out.println(sign + " " + exp + " " + mantissa + " " +
  Float.intBitsToFloat((sign << 31) | (exp + ((1 << 7) - 1)) << 23 | mantissa));

같은 접근법을 더블즈(11비트 지수 및 52비트 맨티사)에도 사용할 수 있다.

long bits = Double.doubleToLongBits(-0.005);
long sign = bits >>> 63;
long exp = (bits >>> 52 & ((1 << 11) - 1)) - ((1 << 10) - 1);
long mantissa = bits & ((1L << 52) - 1);
System.out.println(sign + " " + exp + " " + mantissa + " " +
  Double.longBitsToDouble((sign << 63) | (exp + ((1 << 10) - 1)) << 52 | mantissa));

크레딧: http://s-j.github.io/java-float/

정밀한 계산을 위해서는 플로트 대신 더블을 사용하고, 정확도가 떨어지는 계산을 사용할 때는 더블 대신 플로트를 사용해야 한다.플로트는 십진수 숫자만 포함하지만 이중에는 IEEE754 이중정밀 부동소수점 번호가 들어 있어 보다 정확하게 숫자를 담고 계산하기 쉽다.이게 도움이 되길 바래.

정규 프로그래밍 계산에서는 플로트를 사용하지 않는다.결과 범위가 float data type 범위 내에 있는지 확인하면 메모리를 저장할 float data type을 선택할 수 있다.일반적으로 우리는 두 가지 이유로 두 가지 방법을 사용한다.

  • 부동 소수점 번호를 부동 소수점 데이터 유형으로 사용하려면 메서드 호출자가 명시적으로 F 또는 f 접미사를 접미해야 한다. 기본적으로 모든 부동 소수점 번호는 이중으로 취급되기 때문이다.그것은 프로그래머의 부담을 증가시킨다.부동 소수점 숫자를 이중 데이터 유형으로 사용하면 접미사를 추가할 필요가 없다.
  • 플로트는 단일 정밀한 데이터 유형으로 4바이트를 차지한다.그러므로 큰 계산에서는 완전한 결과를 얻지 못할 것이다.이중 데이터 타입을 선택하면 8바이트를 차지하며 완전한 결과를 얻을 수 있을 것이다.

플로트 데이터 유형과 이중 데이터 유형은 모두 특히 근사 오차가 허용될 수 있는 과학적 계산을 위해 설계되었다.이때 정확도가 가장 먼저 우려되는 사항이라면 플로트나 이중 데이터 유형 대신 BigDecimal 클래스를 사용하는 것이 좋다.출처:- Java에서 데이터 유형 부동이중화

참조URL: https://stackoverflow.com/questions/27598078/float-and-double-datatype-in-java

반응형