[Java] 부동 소수점과 float, long

이해찬·2023년 6월 12일
1

TIL

목록 보기
20/20

23.06.12 - D+12, 주특기1일차[Java]

기록양식
1. 배운내용
2. 개념정리
3. 의문점 or 문제
4. 해결
5. 알게 된 점
6. 응용

1. Java의 정수형/실수형 변수


정수형 변수

  • byte byteNumber = 127; // byte 는 -128 ~ 127 범위의 숫자만 저장 가능합니다.
  • short shortNumber = 32767; // short 는 -32,768~32,767 범위의 숫자만 저장 가능합니다.
  • int intNumber = 2147483647; // int 는 -21억~21억 범위의 숫자만 저장 가능합니다.
  • long longNumber = 2147483647L; // long 은 숫자뒤에 알파벳 L 을 붙여서 표기하며 매우 - 큰수를 저장 가능합니다.

실수형 변수

  • float floatNumber = 0.123f; // float 는 4byte 로 3.4 * 10^38 범위를 표현하는 실수값
  • double doubleNumber = 0.123123123; // double 은 8byte 로 1.7 * 10^308 범위를 표현하는 실수값

low >> 형 변환 >> high
👇👇👇

(정수)byte(1) -> short(2) -> int(4) -> long(8) -> // (실수)float(4) -> double(8)

👇👇

int(4) -> long(8) -> float(4)

👇

🤷‍♀️ float 의 바이트가 더 적은데 어떻게 long보다 넓은 범위를 표현할까?

실수부동 소수점


실수 표현과 부동 소수점에 대해 이해하기 위해서는 먼저 '실수'와 '부동 소수점'이 무엇인지 알아야 합니다.

실수(Real Number):
실수는 소수점이 있는 숫자를 말합니다. 예를 들어, 3.14, 0.01, -2.5 등이 실수입니다. 
이러한 실수는 컴퓨터에서 표현하기 위해 '부동 소수점' 방식을 사용합니다.

부동 소수점(Floating Point):
부동 소수점은 실수를 컴퓨터에서 표현하는 방식입니다. '부동'이란 단어가 의미하는 것은 
소수점의 위치가 고정되어 있지 않고, '움직일 수 있다'는 것입니다. 
이 방식은 매우 큰 수나 매우 작은 수를 표현하는 데 유용합니다.

예를 들어, 0.000123123000000.0 두 수를 생각해봅시다.
이 두 수를 부동 소수점으로 표현하면, 각각 1.23 x 10^-41.23 x 10^8로 표현할 수 있습니다. 여기서 1.23은 '가수(mantissa)'라고 하고, -4와 8은 '지수(exponent)'라고 합니다.
이처럼 부동 소수점은 가수와 지수로 이루어져 있습니다.


결론.

정수타입(long)은 지수를 사용하지 못하고, 실수타입(float)은 지수를 사용할 수 있다. => 제곱의 사용으로 훨씬 더 큰 수(범위)를 만들어 낼 수 있다.

long의 범위 : long64비트(8바이트)를 사용하여 정수를 표현합니다. 이는 2의 64승, 즉 약 -9,223,372,036,854,775,808부터 9,223,372,036,854,775,807까지의 정수를 표현할 수 있습니다.

-922경 3372조 368억 5477만 5807 ~ +922경 3372조 368억 5477만 5807

float의 범위 : 반면에 float32비트(4바이트)를 사용하여 실수를 표현합니다. 그러나 이 32비트는 부동 소수점 방식에 따라 '가수'와 '지수'로 나뉘어 사용됩니다. 이 방식 덕분에 float는 매우 큰 수(약 10^38)부터 매우 작은 수(약 10^-38)까지 표현할 수 있습니다.

+-100,000,000,000,000,000,000,000,000,000,000,000,000 > 백간(^38)
억(^8) < 조(^12) < 경(^16) < 해(^20) < 자(^24) < 자(^24) < 양(^28) < 구(^32) < 간(^36) <백간(^38)

예시 코드

public class Main {
    public static void main(String[] args) {
        long a = 10000000000L;  // 10^10, long으로 표현 가능
        float b = 10000000000F;  // 10^10, float으로 표현 가능

        long c = 10000000000000000000L;  // 10^19, long으로 표현 불가능
        float d = 10000000000000000000F;  // 10^19, float으로 표현 가능

        long e = 0.1L;  // 0.1, long으로 표현 불가능
        float f = 0.1F;  // 0.1, float으로 표현 가능
    }
}

실수 표현 참고하기

profile
디자인에서 개발자로

0개의 댓글