"Double"의 두 판 사이의 차이

위키원
이동: 둘러보기, 검색
1번째 줄: 1번째 줄:
 
'''double'''은 변수 선언 중에서 실수형(예 : 10.24432) 변수를 선언할 때 쓰인다.
 
'''double'''은 변수 선언 중에서 실수형(예 : 10.24432) 변수를 선언할 때 쓰인다.
  
==범위==
+
==개요==
C언어에서 double형의 표현 범위는 전체크기가 8바이트인데 지수부분을 11bit로 늘린 것으로, [[소수]]부분을 52bit로 잡고 같은 방식으로 계산하면 대략 -1.79×10308 ~ 1.79×10308까지의 값이 나오며, 15자리까지 표현할 수 있다.<ref> 이종헌, 〈[https://blog.daum.net/iiiiiiiiiiiiiii99/16590270 double vs float 정수형의 표현 범위.]〉, 《다음블로그》, 2008-09-16 </ref>
+
한정된 기억공간에 이와 같은 값들을 효율적으로 저장하기 위해서 특별한 규칙을 정하였는데, 그것이 [[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>
  
 
==저장과정==
 
==저장과정==
IEEE 754는 IEEE에서 개발한 컴퓨터에서 부동소수점을 표현하는 가장 널리 쓰이는 표준이며  C에서는 double은 배정도(배정밀도(double precision) 64비트)와 대응된다. 다음은 실수 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 precision
*지수부(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진수로 변환하여 지수부에 대응한다.
+
*'''[[지수부]](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진수로 변환하여 지수부에 대응한다.
*가수부 : 정규화한 값의 소수점 아랫부분을 가수부에 순서대로 입력하고 나머지는 모두 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>
  
 
==표현==
 
==표현==
16번째 줄: 16번째 줄:
  
 
===C언어===
 
===C언어===
double형은 %lf 로 출력한다고 하지만 float형과 같이 %f을 써도 출력이된다.(단,double형을 입력 받을 때는 %lf)
+
double형은 %lf 로 출력한다고 하지만 float형과 같이 %f을 써도 출력이된다.(단,double형을 입력 받을 때는 %lf)다음 예제를 보면 알 수 있다.
 +
 
 +
====출력====
 +
* #include <stdio.h>
 +
*{
 +
*double num2 = 3867.215820; // 배정밀도 부동소수점 변수를 선언하고 값을 할당, // double은 숫자 뒤에 아무것도 붙이지 않음
 +
*printf("%f\n", num2);    // 3867.215820
 +
*    return 0;
 +
*}
 +
*실행결과 : 3867.215820
 +
위 예제는 실수 자료형 변수 선언과 출력을 보는거다.double을 [[printf]]로 출력할 때는 서식 지정자로 %f를 사용한다.<ref name="출력"> 〈[https://dojang.io/mod/page/view.php?id=46 실수형 변수 선언하기]〉, 《코딩도장》 </ref>
 +
* #include <stdio.h>
 +
*int main()
 +
*{
 +
*double num2 = -1.3827e-2; // 지수 표기법으로 -0.013827을 표기, // double은 숫자 뒤에 아무것도 붙이지 않음
 +
*printf("%e\n", num2); // -1.382700e-02
 +
*return 0;
 +
*}
 +
위 예제는 지수 자료형 변수 선언과 출력을 보는거다.double을 printf로 출력할 때는 서식 지정자로 %e를 사용한다.<ref name="출력"></ref>
 +
 
 +
====입력====
 +
* #include <stdio.h>
 +
*{
 +
*double d1, d2;
 +
*scanf("%lf %le", &d1, &d2);
 +
*printf("double형 실수 출력 : d1=%lf, d2=%le ", d1, d2);
 +
*return 0;
 +
*}
 +
위 예제는 실수, 지수 자료형을 입력한식을 출력한 것으로 실수로 입력시에는 %lf을 지수로 입력할 때는 %le를 이용한다.<ref> 네트동자, 〈[https://netchobo.tistory.com/22?category=834209 No.20 실수값을 입력할 때 사용하는 서식문자.]〉, 《티스토리》, 2008-09-16 </ref>
 +
 
 +
===자바===
 +
자바 역시 실수부를 표현할 때 사용하며 다음과 같이 표현한다.
 +
 
 +
====출력====
 +
*public class Main {
 +
*public static void main(String[] args) {
 +
*double number = 0.01;
 +
*System.out.println(number);
 +
*}
 +
*}
 +
*실행 결과 : 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 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>
 +
 
 +
{{각주}}
 +
 
 +
==참고자료==
 +
* 이종헌, 〈[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
 +
 
 +
==같이보기==
 +
*[[지수부]]
 +
*[[가수부]]
 +
*[[스케너]]

2021년 8월 20일 (금) 16:38 판

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

개요

한정된 기억공간에 이와 같은 값들을 효율적으로 저장하기 위해서 특별한 규칙을 정하였는데, 그것이 IEEE(아이트리플이) 754 표준이다. C컴파일러는 이 표준에 따라 구현한것이며 C언어에서 double형의 표현 범위는 전체크기가 8바이트(64bit)인데 이중에서 지수부분을 11bit로 늘린 것으로, 소수부분을 52bit로 잡고 같은 방식으로 계산하면 대략 -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 precision
  • 지수부(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진수로 변환하여 지수부에 대응한다.
  • 가수부 : 정규화한 값의 소수점 아랫부분을 가수부에 순서대로 입력하고 나머지는 모두 0으로 처리하고 소수점 아랫부분은 0001이므로 00010000.....0000으로 가수부에 입력하는 이런 식의 과정을 거친다.[2]

표현

각 프로그래밍 마다 표현 방식이 다르다. 다음은 각 프로그래밍의 표현방식이다.

C언어

double형은 %lf 로 출력한다고 하지만 float형과 같이 %f을 써도 출력이된다.(단,double형을 입력 받을 때는 %lf)다음 예제를 보면 알 수 있다.

출력

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

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

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

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

입력

  • #include <stdio.h>
  • {
  • double d1, d2;
  • scanf("%lf %le", &d1, &d2);
  • printf("double형 실수 출력 : d1=%lf, d2=%le ", d1, d2);
  • return 0;
  • }

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

자바

자바 역시 실수부를 표현할 때 사용하며 다음과 같이 표현한다.

출력

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

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

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

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

입력

입력하는 다음과 같이 나와 있다.

  • 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]

각주

  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

참고자료

같이보기