float 데이터 유형은 단 정밀도 32 비트 IEEE 754 부동 소수점이며 double 데이터 유형은 배정 밀도 64 비트 IEEE 754 부동 소수점입니다.Java에서의 float 및 double 데이터 유형
어떤 의미입니까? 그리고 언제 double을 대신 float을 사용해야합니까?
float 데이터 유형은 단 정밀도 32 비트 IEEE 754 부동 소수점이며 double 데이터 유형은 배정 밀도 64 비트 IEEE 754 부동 소수점입니다.Java에서의 float 및 double 데이터 유형
어떤 의미입니까? 그리고 언제 double을 대신 float을 사용해야합니까?
Wikipedia page은 시작하기 좋은 곳입니다.
정리해 :
float
은, 1 부호 비트와, 32 비트에서 8 비트의 지수 및 유효수 23 비트 표현 (또는 어떤 과학적 표기법 번호는 다음된다 2.33728을 * 10 ; 33728은 유효 숫자입니다.
double
은 64 비트, 1 부호 비트, 지수 11 비트 및 유효 숫자 52 비트로 표현된다. 기본적으로
는, 자바는 부동 소수점 숫자 (그래서 문자 3.14
이 double
입력 된)을 표현하기 위해 double
를 사용합니다. 또한 더 큰 숫자 범위를 제공하는 데이터 유형이기 때문에 float
이상의 사용을 강력히 권장합니다.
특정 실제로 float
의 사용량을 강제 도서관, 그러나 일반적으로있을 수 있습니다 - 당신은 당신의 결과가 float
의 prescribed range가, 다음은 double
으로 선택하는 것이 최선의 방법에 들어갈 정도로 작은 것이라고 보장 할 수 없다면. 당신은 정확성이 필요한 경우
은 - 다음, 예를 들어, 당신은 부정확 진수 값 (같은 1/10 + 2/10
)를 가질 수 없습니다, 또는 당신이 (시스템에 $ 10.33를 대표하는, 예를 들어) 통화를 아무것도을하고있는 BigDecimal
을 사용하면 임의의 양의 정밀도를 지원하고 그와 같은 상황을 우아하게 처리 할 수 있습니다.
주어진 예제에서 233728 == 가수가 아닌가요? 내 말은, 정수 부분은 어디에 저장되어 있는가? – JaLoveAst1k
알고 싶습니다. 233728이 가수 여야합니다. – joshreesjones
@ mathguy54 : 과학 표기법에서 2는 정수이고 .33728은 가수입니다. [여기에 대한 참고 사항입니다.] (https://en.wikipedia.org/wiki/Significand) – Makoto
부표는 약입니다. 6-7 십진수는 정밀도를 나타냅니다. 15-16. 또한 숫자의 범위는 double의 경우 더 큽니다.
double에는 8 바이트의 저장 공간이 필요하고 float에는 4 바이트 만 있으면됩니다.
실수로 알려진 부동 소수점 숫자는 분수 정밀도가 필요한 표현식을 평가할 때 사용됩니다. 예를 들어 제곱근 또는 사인 및 코사인과 같은 초월점과 같은 계산 결과는 부동 소수점 유형이 필요한 정밀도 값이됩니다. Java는 부동 소수점 유형 및 연산자의 표준 (IEEE-754) 세트를 구현합니다. float 및 double의 두 종류가 있으며 각각 단 정밀도 및 배정 밀도 숫자를 나타냅니다. 이들의 폭과 범위는 여기에 나타낸 바와 같다 : float 형 스토리지의 32 비트를 사용하여 단 정밀도 값을 지정
Name Width in Bits Range
double 64 1 .7e–308 to 1.7e+308
float 32 3 .4e–038 to 3.4e+038
로트.단 정밀도는 일부 프로세서에서 더 빠르며 배정도만큼 공간의 절반을 차지하지만 값이 매우 크거나 작을 때 부정확 해집니다. float 유형의 변수는 분수 구성 요소가 필요할 때 유용하지만 큰 정밀도가 필요하지는 않습니다. 예를 들어, float은 달러와 센트를 나타낼 때 유용 할 수 있습니다. 여기
플로트 hightemp, lowtemp 단계; 이중 키워드로 나타낸 바와 같이
이중
더블 정밀도는, 값을 저장하기 위해 64 비트를 사용한다. 이중 정밀도는 고속 수학 계산에 맞게 최적화 된 일부 최신 프로세서에서는 단 정밀도보다 실제로 빠릅니다. sin(), cos() 및 sqrt()와 같은 모든 초월 수학 함수는 double 값을 반환합니다. 많은 반복 계산에 대해 정확성을 유지해야하거나 큰 값을 조작하는 경우에는 이중을 선택하는 것이 가장 좋습니다.
IEEE 표준에 따르면 float는 실수의 32 비트 표현이고 double은 64 비트 표현입니다.
Java 프로그램에서 우리는 대개 대부분 이중 데이터 형식을 사용합니다. 이중 데이터 유형을 사용하여 수용 할 수있는 숫자의 범위가 float이 사용될 때의 범위보다 많기 때문에 오버플로를 방지하는 것입니다.
또한 고정밀도가 필요한 경우에는 두 배 사용을 권장합니다. 오래 전에 구현 된 몇몇 라이브러리 메소드는 float 데이터 유형을 필수로 사용해야합니다 (즉, float 만 사용하여 구현 되었기 때문에!).
그러나 프로그램에 작은 숫자가 필요하고 float를 사용할 때 오버플로가 발생하지 않는다고 확신하면 float를 사용하면 float가 두 배로 필요한 메모리의 절반을 필요로하므로 공간 복잡성이 크게 향상됩니다.
자바는 그럼에도 불구하고 계산에 두 번 사용을 향한 편견 갖고있는 것 같아요 : 나는 부동 소수점을 사용하는 경우
점에서케이스 내가 오늘 아침에 쓴 프로그램이 방법이 작동하지 않았다,하지만 내가 플로트를 교체 할 때 지금 잘 작동 (넷빈즈 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;
}
}
오늘도 같은 문제가있었습니다. 이 편향의 원인은 무엇일까요? – Shachi
예는 자바 플로트에서 지수 (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));
double (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/
당신은 두 번 대신 수레를 사용해야합니다. 보다 정확한 계산이 필요한 경우 double을 사용하십시오. – Everv0id
@ Everv0id : 메모리가 너무 빡빡해서 공간의 정확도를 희생해야만하는 상황에 대해서는 확신 할 수 없습니다. (선의를 위해 * Java *를 사용하고 있습니다 ...) 그것이 요구 될 때 상황이있을 수 있지만 제 연습에서는 아주 드물게 보았습니다. 왜 이것이 좋은 생각이라고 생각 하는지를 자세히 설명하고 싶다면 for-instance로 답을하면 가치있는 추가가 될 것입니다. – Makoto
http : //en.wikipedia.org/wiki/IEEE_floating_point –