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

"Double"의 두 판 사이의 차이

해시넷
이동: 둘러보기, 검색
(개요)
잔글
 
(사용자 3명의 중간 판 9개는 보이지 않습니다)
1번째 줄: 1번째 줄:
'''double'''은 변수 선언 중에서 실수형(예 : 10.24432) 변수를 선언할 때 쓰인다.
+
'''double'''(더블)은 변수 선언 중에서 [[실수형]](예: 10.24432) [[변수]]를 선언할 때 쓰인다.
  
 
==개요==
 
==개요==
한정된 기억공간에 이와 같은 값들을 효율적으로 저장하기 위해서 특별한 규칙을 정하였는데, 그것이 [[IEEE]](아이트리플이) 754 표준이다. C 컴파일러는 이 표준에 따라 구현한 것이며 C언어에서 double형의 표현 범위는 전체크기가 8바이트(64bit)인데 이 중에서 지수 부분을 11bit로 늘린 것으로, [[소수]]부분을 52bit로 잡고 같은 방식으로 계산하면 대략 -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>
  
==저장과정==
+
==저장 과정==
 
다음은 실수 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으로 가수부에 입력하는 이런 식의 과정을 거친다.<ref> ComputerScience, 〈[https://backstreet-programmer.tistory.com/140 (컴퓨터과학/C언어) IEEE 754 double 형 변환 (64bit)]〉, 《티스토리》, 2020-05-29 </ref>
+
#*가수부 : 정규화한 값의 소수점 아랫부분을 가수부에 순서대로 입력하고 나머지는 모두 0으로 처리한다. 소수점 아랫부분은 0001이므로 00010000.....0000으로 가수부에 입력하는 과정을 거친다.<ref> ComputerScience, 〈[https://backstreet-programmer.tistory.com/140 (컴퓨터과학/C언어) IEEE 754 double 형 변환 (64bit)]〉, 《티스토리》, 2020-05-29 </ref>
  
 
==표현==
 
==표현==
각 프로그래밍 마다 표현 방식이 다르다. 다음은 각 프로그래밍의 표현방식이다.
 
 
 
===C언어===
 
===C언어===
double형은 %lf 로 출력한다고 하지만 float형과 같이 %f을 써도 출력이된다.(단,double형을 입력 받을 때는 %lf)다음 예제를 보면 알 수 있다.
+
double형은 %lf로 출력한다고 하지만 [[float]]형과 같이 %f를 써도 출력이 된다. 단, double형을 입력받을 때는 %lf로 출력한다.
  
 
====출력====
 
====출력====
* #include <stdio.h>
+
실수 자료형 변수 선언과 출력에 대한 예제이다. double을 [[printf]]로 출력할 때는 서식 지정자로 %f를 사용한다.<ref name="출력"> 〈[https://dojang.io/mod/page/view.php?id=46 실수형 변수 선언하기]〉, 《코딩도장》 </ref>
*{
+
 
*double num2 = 3867.215820; // 배정밀도 부동소수점 변수를 선언하고 값을 할당, // double은 숫자 뒤에 아무것도 붙이지 않음
+
int main()
*printf("%f\n", num2);    // 3867.215820
+
{
*    return 0;
+
    double num2 = 3867.215820; // 배정밀도 부동소수점 변수를 선언하고 값을 할당, // double은 숫자 뒤에 아무것도 붙이지 않음
*}
+
    printf("%f\n", num2);    // 3867.215820
*실행결과 : 3867.215820
+
    return 0;
위 예제는 실수 자료형 변수 선언과 출력을 보는거다.double을 [[printf]]로 출력할 때는 서식 지정자로 %f를 사용한다.<ref name="출력"> 〈[https://dojang.io/mod/page/view.php?id=46 실수형 변수 선언하기]〉, 《코딩도장》 </ref>
+
}
* #include <stdio.h>
+
실행 결과 : 3867.215820
*int main()
+
 
*{
+
지수 자료형 변수 선언과 출력에 대한 예제이다. double을 printf로 출력할 때는 서식 지정자로 %e를 사용한다.<ref name="출력"></ref>
*double num2 = -1.3827e-2; // 지수 표기법으로 -0.013827을 표기, // double은 숫자 뒤에 아무것도 붙이지 않음
+
 
*printf("%e\n", num2); // -1.382700e-02
+
int main()
*return 0;
+
{
*}
+
    double num2 = -1.3827e-2; // 지수 표기법으로 -0.013827을 표기, // double은 숫자 뒤에 아무것도 붙이지 않음
위 예제는 지수 자료형 변수 선언과 출력을 보는거다.double을 printf로 출력할 때는 서식 지정자로 %e를 사용한다.<ref name="출력"></ref>
+
    printf("%e\n", num2); // -1.382700e-02
 +
    return 0;
 +
}
  
 
====입력====
 
====입력====
* #include <stdio.h>
+
실수, 지수 자료형을 입력한 식을 출력한 예제이다. 실수를 입력할 때에는 %lf, 지수로 입력할 때는 %le를 이용한다.<ref> 네트동자, 〈[https://netchobo.tistory.com/22?category=834209 No.20 실수값을 입력할 때 사용하는 서식문자.]〉, 《티스토리》, 2008-09-16 </ref>
*{
+
 
*double d1, d2;
+
int main()
*scanf("%lf %le", &d1, &d2);
+
{
*printf("double형 실수 출력 : d1=%lf, d2=%le ", d1, d2);
+
    double d1, d2;
*return 0;
+
    scanf("%lf %le", &d1, &d2);
*}
+
    printf("double형 실수 출력 : d1=%lf, d2=%le ", d1, d2);
위 예제는 실수, 지수 자료형을 입력한식을 출력한 것으로 실수로 입력시에는 %lf을 지수로 입력할 때는 %le를 이용한다.<ref> 네트동자, 〈[https://netchobo.tistory.com/22?category=834209 No.20 실수값을 입력할 때 사용하는 서식문자.]〉, 《티스토리》, 2008-09-16 </ref>
+
    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 class Main {
+
public static void main(String[] args) {
*public static void main(String[] args) {
+
double number = 0.01 + 0.001+ 0.0001;
*double number = 0.01;
+
System.out.[[println]](number);
*System.out.println(number);
+
      }
*}
+
}
*}
+
실행 결과 : 0.011099999999999999
*실행 결과 : 0.01
 
보기와 같이 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 + 0.001+ 0.0001;
 
*System.out.[[println]](number);
 
*}
 
*}
 
*실행 결과 : 0.011099999999999999
 
하지만 보기와 같이 정확성이 떨어지는 단점이 있다.<ref name="자바"></ref>
 
  
 
====입력====
 
====입력====
입력하는 다음과 같이 나와 있다.
+
public class Test {
*public class Test {
+
public static void main(String[] args) {
*public static void main(String[] args) {
+
Scanner scan = new Scanner( System.in )
*Scanner scan = new Scanner( System.in )
+
System.out.print( "오늘의 이율은? : " );
*System.out.print( "오늘의 이율은? : " );
+
double rate = scan.nextDouble();
*double rate = scan.nextDouble();
+
System.out.println( rate + " %" );
*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>
+
[[스캐너]](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
+
* 이종헌, 〈[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
 
* 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://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 실수형 변수 선언하기]〉, 《티스토리》
88번째 줄: 114번째 줄:
 
* 자바(Java) 강의, 〈[https://imasoftwareengineer.tistory.com/50 자바 변수와 자료형 (4) float, double]〉, 《티스토리》, 2019-03-05
 
* 자바(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
 
* 프로그래밍/자바(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 문서는 프로그래밍에 관한 글로서 검토가 필요합니다. 위키 문서는 누구든지 자유롭게 편집할 수 있습니다. [편집]을 눌러 문서 내용을 검토·수정해 주세요.