검수요청.png검수요청.png

"Double"의 두 판 사이의 차이

위키원
이동: 둘러보기, 검색
(저장과정)
잔글
 
(사용자 3명의 중간 판 12개는 보이지 않습니다)
1번째 줄: 1번째 줄:
'''double'''은 변수 선언중에서 실수형(예 : 10.24432)변수를 선언할 때 쓰인다.
+
'''double'''(더블)은 변수 선언 중에서 [[실수형]](예: 10.24432) [[변수]]를 선언할 때 쓰인다.
  
==범위==
+
==개요==
C언어에서 double형의 표현 범위는 전체크기가 8바이트 인데 지수부분을 11비트로 늘린 것으로, [[소수]]부분을 52비트로 잡고 같은 방식으로 계산하면 대략 -1.79×10308 ~ 1.79×10308 까지의 값이 나오며,15자리까지 표현할 수 있으며 그 형식은 <ref> 이종헌, 〈[https://blog.daum.net/iiiiiiiiiiiiiii99/16590270 double vs float 정수형의 표현 범위.]〉, 《다음블로그》, 2008-09-16 </ref>
+
double은 8바이트(64비트) 크기를 가지는 기본 자료형이다. IEEE 754 표준은 실수 값을 저장하기 위해 4바이트, 8바이트, 16바이트 등의 저장 형식을 정의했는데, 그 중 하나가 double이다. double 형식은 전체 크기가 8바이트인데 지수 부분을 11비트로 늘린 것이다. C [[컴파일러]]는 이 표준에 따라 구현했다. [[C언어]]에서 [[소수]] 부분을 52비트로 잡고 같은 방식으로 계산하면 대략 -1.79×10308 ~ 1.79×10308까지의 값이 나오며, 15자리까지 표현할 수 있다.<ref> 이종헌, 〈[https://blog.daum.net/iiiiiiiiiiiiiii99/16590270 double vs float 정수형의 표현 범위.]〉, 《다음 블로그》, 2008-09-16 </ref>
  
==저장과정==
+
==저장 과정==
IEEE 754는 IEEE에서 개발한 컴퓨터에서 부동소수점을 표현하는 가장 널리 쓰이는 표준이며  C에서는 double은 배정도와 대응된다.다음은 실수8.5를 double에 저장과정이다.
+
다음은 실수 8.5를 double에 저장하는 과정이다.
 
#2진수 변환 : 변환하고자 하는 숫자가 8진수, 10진수, 16진수든 상관없이 변환하고자 하는 숫자를 2진수로 변환하는 것으로 8.5를 2진수로 변환하면 1000.1이다.
 
#2진수 변환 : 변환하고자 하는 숫자가 8진수, 10진수, 16진수든 상관없이 변환하고자 하는 숫자를 2진수로 변환하는 것으로 8.5를 2진수로 변환하면 1000.1이다.
#정규화 (Specific notation) : 변환한 2진수를 정규화하는 것으로 1000.1x(2^3)(^3 : 세제곱)
+
#정규화(Specific notation) : 변환한 2진수를 정규화하는 것으로 1000.1x(2^3)(^3 : 세제곱)
#IEEE 754 double precision
+
#IEEE 754 double 정밀도
*지수부(exponent) : IEEE 754 는 bias 표현법으로 양수와 음수를 표현하고 지수부(exponent) = bias + power, 지수부가 n비트라면 2^(n-1) - 1을 바이어스 상수라고 하며 정규화결과 1.0001x 2^3이므로 power = 3이고, 지수부는 11bit 이므로 bias = 1023 지수부(exponent) = bias + power = 1023 + 3 = 1026이고 이것을 2진수로 변환하여 지수부에 대응한다.
+
#*지수부 : IEEE 754 는 바이아스 표현법으로 양수와 음수를 표현하고 지수부(exponent) = bias + power, 지수부가 n 비트라면 2^(n-1) - 1을 바이어스 상수라고 한다. 정규화 결과 1.0001x 2^3이므로 power = 3이고, 지수부는 11bit이므로 bias = 1023 지수부(exponent) = bias + power = 1023 + 3 = 1026이다. 이것을 2진수로 변환하여 지수부에 대응한다.
*가수부 : 정규화 한 값의 소수점 아래 부분을 가수부에 순서대로 입력하고 나머지는 모두 0으로 처리하고 소수점 아래 부분은 0001 이므로 00010000.....0000으로 가수부에 입력
+
#*가수부 : 정규화한 값의 소수점 아랫부분을 가수부에 순서대로 입력하고 나머지는 모두 0으로 처리한다. 소수점 아랫부분은 0001이므로 00010000.....0000으로 가수부에 입력하는 과정을 거친다.<ref> ComputerScience, 〈[https://backstreet-programmer.tistory.com/140 (컴퓨터과학/C언어) IEEE 754 double 형 변환 (64bit)]〉, 《티스토리》, 2020-05-29 </ref>
이런식의 과정을 거친다.
+
 
 +
==표현==
 +
===C언어===
 +
double형은 %lf로 출력한다고 하지만 [[float]]형과 같이 %f를 써도 출력이 된다. 단, double형을 입력받을 때는 %lf로 출력한다.
 +
 
 +
====출력====
 +
실수 자료형 변수 선언과 출력에 대한 예제이다. double을 [[printf]]로 출력할 때는 서식 지정자로 %f를 사용한다.<ref name="출력"> 〈[https://dojang.io/mod/page/view.php?id=46 실수형 변수 선언하기]〉, 《코딩도장》 </ref>
 +
 
 +
int main()
 +
{
 +
    double num2 = 3867.215820; // 배정밀도 부동소수점 변수를 선언하고 값을 할당, // double은 숫자 뒤에 아무것도 붙이지 않음
 +
    printf("%f\n", num2);    // 3867.215820
 +
    return 0;
 +
}
 +
실행 결과 : 3867.215820
 +
 
 +
지수 자료형 변수 선언과 출력에 대한 예제이다. double을 printf로 출력할 때는 서식 지정자로 %e를 사용한다.<ref name="출력"></ref>
 +
 
 +
int main()
 +
{
 +
    double num2 = -1.3827e-2; // 지수 표기법으로 -0.013827을 표기, // double은 숫자 뒤에 아무것도 붙이지 않음
 +
    printf("%e\n", num2); // -1.382700e-02
 +
    return 0;
 +
}
 +
 
 +
====입력====
 +
실수, 지수 자료형을 입력한 식을 출력한 예제이다. 실수를 입력할 때에는 %lf, 지수로 입력할 때는 %le를 이용한다.<ref> 네트동자, 〈[https://netchobo.tistory.com/22?category=834209 No.20 실수값을 입력할 때 사용하는 서식문자.]〉, 《티스토리》, 2008-09-16 </ref>
 +
 
 +
int main()
 +
{
 +
    double d1, d2;
 +
    scanf("%lf %le", &d1, &d2);
 +
    printf("double형 실수 출력 : d1=%lf, d2=%le ", d1, d2);
 +
    return 0;
 +
}
 +
 
 +
===자바===
 +
====출력====
 +
다음 예제와 같이 f를 붙여주지 않아도 소수점을 표현할 수 있다.<ref name="자바"> 자바(Java) 강의, 〈[https://imasoftwareengineer.tistory.com/50 자바 변수와 자료형 (4) float, double]〉, 《티스토리》, 2019-03-05 </ref>
 +
 
 +
public class Main {
 +
public static void main(String[] args) {
 +
double number = 0.01;
 +
System.out.println(number);
 +
      }
 +
}
 +
실행 결과 : 0.01
 +
 
 +
하지만 정확성이 떨어지는 단점이 있다.<ref name="자바"></ref>
 +
 
 +
public class Main {
 +
public static void main(String[] args) {
 +
double number = 0.01 + 0.001+ 0.0001;
 +
System.out.[[println]](number);
 +
      }
 +
}
 +
실행 결과 : 0.011099999999999999
 +
 
 +
====입력====
 +
public class Test {
 +
public static void main(String[] args) {
 +
Scanner scan = new Scanner( System.in )
 +
System.out.print( "오늘의 이율은? : " );
 +
double rate = scan.nextDouble();
 +
System.out.println( rate + " %" );
 +
      }
 +
}
 +
 
 +
[[스캐너]](scanner)는 자바에서 키보드로 데이터를 입력받을 때 사용하는 클래스이다.<ref> 프로그래밍/자바(java), 〈[https://athena7.tistory.com/entry/java-Scanner-Systemin-%ED%82%A4%EB%B3%B4%EB%93%9C-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%9E%85%EB%A0%A5%EB%B0%9B%EA%B8%B0 JAVA - SCANNER , SYSTEM.IN 키보드 데이터 입력받기]〉, 《티스토리》, 2019-06-25 </ref>
 +
 
 +
== 형변환 ==
 +
; Double.Parse()
 +
 
 +
string a = "154.88";
 +
Double b = (Double.Parse(a));
 +
MessageBox.Show(b.ToString());
 +
 
 +
Double.Parse() 함수는 값을 double로 변환해 준다. 위의 결과는 154.88 정수로 변환이 되어 출력된다.
 +
 
 +
; Double.TryParse()
 +
 
 +
string a = "154.88";
 +
Double b;
 +
if (Double.TryParse(a, out b))
 +
{
 +
    MessageBox.Show(b.ToString());
 +
}
 +
else
 +
{
 +
    MessageBox.Show("숫자가 아닙니다.");
 +
}
 +
 
 +
위의 결과는 변환이 성공한 경우 정수 값을 변환하여 154.88를 띄우고, 실패할 경우 '숫자가 아닙니다.'라는 메세지를 띄운다. Double.TryParse 함수는 두 가지의 인자를 받는다. 첫 번째는 변환할 문자열이고, 두 번째는 out 키워드로 수정되며 반환되는 값은 TryParse의 성공 여부를 나타낸다. Double.TryParse의 반환값은 [[bool]]형이며 성공적으로 변환이 되었으면 [[true]], 그렇지 않으면 [[false]]가 반환된다. out b의 의미는 결과값을 b에 저장하라는 의미이다. 즉, Double.Parse() 함수와 Double.TryParse() 함수의 차이점은 Double.Parse() 함수는 값만 변환해 주는 것이며 Double.TryParse() 함수는 값을 변환하면서 값의 성공 여부를 확인할 수 있다.<ref> Mir.J Webma_Mir, 〈[https://mirwebma.tistory.com/196 (C#/.Net)(String To Double) String 을 Double 로 형변환하기]〉, 《티스토리》, 2021-01-06 </ref>
 +
 
 +
{{각주}}
 +
 
 +
==참고자료==
 +
* 이종헌, 〈[https://blog.daum.net/iiiiiiiiiiiiiii99/16590270 double vs float 정수형의 표현 범위.]〉, 《다음 블로그》, 2008-09-16
 +
* ComputerScience, 〈[https://backstreet-programmer.tistory.com/140 (컴퓨터과학/C언어) IEEE 754 double 형 변환 (64bit)]〉, 《티스토리》, 2020-05-29
 +
* 〈[https://athena7.tistory.com/entry/java-Scanner-Systemin-%ED%82%A4%EB%B3%B4%EB%93%9C-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%9E%85%EB%A0%A5%EB%B0%9B%EA%B8%B0 실수형 변수 선언하기]〉, 《티스토리》
 +
* 네트동자, 〈[https://netchobo.tistory.com/22?category=834209 No.20 실수값을 입력할 때 사용하는 서식문자.]〉, 《티스토리》, 2008-09-16
 +
* 자바(Java) 강의, 〈[https://imasoftwareengineer.tistory.com/50 자바 변수와 자료형 (4) float, double]〉, 《티스토리》, 2019-03-05
 +
* 프로그래밍/자바(java), 〈[https://athena7.tistory.com/entry/java-Scanner-Systemin-%ED%82%A4%EB%B3%B4%EB%93%9C-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%9E%85%EB%A0%A5%EB%B0%9B%EA%B8%B0 JAVA - SCANNER , SYSTEM.IN 키보드 데이터 입력받기]〉, 《티스토리》, 2019-06-25
 +
* Mir.J Webma_Mir, 〈[https://mirwebma.tistory.com/196 (C#/.Net)(String To Double) String 을 Double 로 형변환하기]〉, 《티스토리》, 2021-01-06
 +
 
 +
==같이 보기==
 +
*[[지수부]]
 +
*[[가수부]]
 +
*[[스캐너]]
 +
 
 +
{{프로그래밍|검토 필요}}

2021년 9월 8일 (수) 18:37 기준 최신판

double(더블)은 변수 선언 중에서 실수형(예: 10.24432) 변수를 선언할 때 쓰인다.

개요[편집]

double은 8바이트(64비트) 크기를 가지는 기본 자료형이다. IEEE 754 표준은 실수 값을 저장하기 위해 4바이트, 8바이트, 16바이트 등의 저장 형식을 정의했는데, 그 중 하나가 double이다. double 형식은 전체 크기가 8바이트인데 지수 부분을 11비트로 늘린 것이다. C 컴파일러는 이 표준에 따라 구현했다. C언어에서 소수 부분을 52비트로 잡고 같은 방식으로 계산하면 대략 -1.79×10308 ~ 1.79×10308까지의 값이 나오며, 15자리까지 표현할 수 있다.[1]

저장 과정[편집]

다음은 실수 8.5를 double에 저장하는 과정이다.

  1. 2진수 변환 : 변환하고자 하는 숫자가 8진수, 10진수, 16진수든 상관없이 변환하고자 하는 숫자를 2진수로 변환하는 것으로 8.5를 2진수로 변환하면 1000.1이다.
  2. 정규화(Specific notation) : 변환한 2진수를 정규화하는 것으로 1000.1x(2^3)(^3 : 세제곱)
  3. IEEE 754 double 정밀도
    • 지수부 : IEEE 754 는 바이아스 표현법으로 양수와 음수를 표현하고 지수부(exponent) = bias + power, 지수부가 n 비트라면 2^(n-1) - 1을 바이어스 상수라고 한다. 정규화 결과 1.0001x 2^3이므로 power = 3이고, 지수부는 11bit이므로 bias = 1023 지수부(exponent) = bias + power = 1023 + 3 = 1026이다. 이것을 2진수로 변환하여 지수부에 대응한다.
    • 가수부 : 정규화한 값의 소수점 아랫부분을 가수부에 순서대로 입력하고 나머지는 모두 0으로 처리한다. 소수점 아랫부분은 0001이므로 00010000.....0000으로 가수부에 입력하는 과정을 거친다.[2]

표현[편집]

C언어[편집]

double형은 %lf로 출력한다고 하지만 float형과 같이 %f를 써도 출력이 된다. 단, double형을 입력받을 때는 %lf로 출력한다.

출력[편집]

실수 자료형 변수 선언과 출력에 대한 예제이다. double을 printf로 출력할 때는 서식 지정자로 %f를 사용한다.[3]

int main()
{
    double num2 = 3867.215820; // 배정밀도 부동소수점 변수를 선언하고 값을 할당, // double은 숫자 뒤에 아무것도 붙이지 않음
    printf("%f\n", num2);    // 3867.215820
    return 0;
}
실행 결과 : 3867.215820

지수 자료형 변수 선언과 출력에 대한 예제이다. double을 printf로 출력할 때는 서식 지정자로 %e를 사용한다.[3]

int main()
{
    double num2 = -1.3827e-2; // 지수 표기법으로 -0.013827을 표기, // double은 숫자 뒤에 아무것도 붙이지 않음
    printf("%e\n", num2); // -1.382700e-02
    return 0;
}

입력[편집]

실수, 지수 자료형을 입력한 식을 출력한 예제이다. 실수를 입력할 때에는 %lf, 지수로 입력할 때는 %le를 이용한다.[4]

int main()
{
    double d1, d2;
    scanf("%lf %le", &d1, &d2);
    printf("double형 실수 출력 : d1=%lf, d2=%le ", d1, d2);
    return 0;
}

자바[편집]

출력[편집]

다음 예제와 같이 f를 붙여주지 않아도 소수점을 표현할 수 있다.[5]

public class Main {
public static void main(String[] args) {
double number = 0.01;
System.out.println(number);
      }
}
실행 결과 : 0.01

하지만 정확성이 떨어지는 단점이 있다.[5]

public class Main {
public static void main(String[] args) {
double number = 0.01 + 0.001+ 0.0001;
System.out.println(number);
      }
}
실행 결과 : 0.011099999999999999

입력[편집]

public class Test {
public static void main(String[] args) {
Scanner scan = new Scanner( System.in )
System.out.print( "오늘의 이율은? : " );
double rate = scan.nextDouble();
System.out.println( rate + " %" );
      }
}

스캐너(scanner)는 자바에서 키보드로 데이터를 입력받을 때 사용하는 클래스이다.[6]

형변환[편집]

Double.Parse()
string a = "154.88";
Double b = (Double.Parse(a));
MessageBox.Show(b.ToString());

Double.Parse() 함수는 값을 double로 변환해 준다. 위의 결과는 154.88 정수로 변환이 되어 출력된다.

Double.TryParse()
string a = "154.88";
Double b;
if (Double.TryParse(a, out b))
{
    MessageBox.Show(b.ToString());
}
else
{
    MessageBox.Show("숫자가 아닙니다.");
}

위의 결과는 변환이 성공한 경우 정수 값을 변환하여 154.88를 띄우고, 실패할 경우 '숫자가 아닙니다.'라는 메세지를 띄운다. Double.TryParse 함수는 두 가지의 인자를 받는다. 첫 번째는 변환할 문자열이고, 두 번째는 out 키워드로 수정되며 반환되는 값은 TryParse의 성공 여부를 나타낸다. Double.TryParse의 반환값은 bool형이며 성공적으로 변환이 되었으면 true, 그렇지 않으면 false가 반환된다. out b의 의미는 결과값을 b에 저장하라는 의미이다. 즉, Double.Parse() 함수와 Double.TryParse() 함수의 차이점은 Double.Parse() 함수는 값만 변환해 주는 것이며 Double.TryParse() 함수는 값을 변환하면서 값의 성공 여부를 확인할 수 있다.[7]

각주[편집]

  1. 이종헌, 〈double vs float 정수형의 표현 범위.〉, 《다음 블로그》, 2008-09-16
  2. ComputerScience, 〈(컴퓨터과학/C언어) IEEE 754 double 형 변환 (64bit)〉, 《티스토리》, 2020-05-29
  3. 3.0 3.1 실수형 변수 선언하기〉, 《코딩도장》
  4. 네트동자, 〈No.20 실수값을 입력할 때 사용하는 서식문자.〉, 《티스토리》, 2008-09-16
  5. 5.0 5.1 자바(Java) 강의, 〈자바 변수와 자료형 (4) float, double〉, 《티스토리》, 2019-03-05
  6. 프로그래밍/자바(java), 〈JAVA - SCANNER , SYSTEM.IN 키보드 데이터 입력받기〉, 《티스토리》, 2019-06-25
  7. Mir.J Webma_Mir, 〈(C#/.Net)(String To Double) String 을 Double 로 형변환하기〉, 《티스토리》, 2021-01-06

참고자료[편집]

같이 보기[편집]


  검수요청.png검수요청.png 이 Double 문서는 프로그래밍에 관한 글로서 검토가 필요합니다. 위키 문서는 누구든지 자유롭게 편집할 수 있습니다. [편집]을 눌러 문서 내용을 검토·수정해 주세요.