내가 전부터 이상한걸 느끼고 있던거지만,

새삼 각잡고 테스트 해보니 역시 이상함.


아래 코드는 어째서 결과가 다른거임???


일단 코드 쓰기전에 선요약 설명함.

부동소숫점 실수 자료형은 연산간에 오차가 생길 수 있음.

예를들어 1.00 + 1.22 = 2.22 이 수학적으로 맞는 숫자이나,

부동소숫점 자료형은 이 연산이 1.00 + 1.22 != 2.22 가 됨.

그런데 100.0 + 122.0 은 222.0과 같음.


간단하게


print((1.00  + 1.22) == 2.22) # False
print((100.0 + 122.0) == 222.0) # True


이렇게 됨.

(다른 언어들도 아마 다 마찬가지겠지. 안해봤지만...)



테스트 해본 코드는 아래와 같은데

위에서 말한대로 정수에 해당하는 실수는 전혀 에러로 나오는게 없는데

그냥 소숫점 아래 있는 실수는 1000번 돌리면 평균 200개는 에러임.


- 정수 -> 실수 테스트

1. 정수를 랜덤으로 고름.

2. 정수를 실수로 변환.

3. 그대로 정수 더하기와 실수 더하기를 비교해서 출력.

- 그냥 실수 테스트

1. 정수를 랜덤으로 고름.

2. 정수 합산은 1,000,000 으로 나눔

3. 실수쪽은 각항을 먼저 1,000,000.0 으로 나누고 합산하고 비교.


---------------------------------------------------------



# 파이썬 3 코드임.

import numpy as np

total_episodes = 10_000_000
# total_episodes = 1000
episode = 0
err_cnt = 0
# while True :
while episode < total_episodes :
  # 정수 -> 실수(소숫점 아래 값 없음)
  a = np.random.randint(10_000_000_000_000)
  b = np.random.randint(10_000_000_000_000)
  c = a + b
  af = float(a)
  bf = float(b)
  cf = float(c)

  # # 실수(소숫점 아래 값 만듬)
  # a = np.random.randint(10_000_000_000_000)
  # b = np.random.randint(10_000_000_000_000)
  # c = (a + b) / 1_000_000
  # af = float(a) / 1_000_000.0
  # bf = float(b) / 1_000_000.0
  # cf = float(c)

  if (af + bf) != cf :
    print(f"불일치 : {a}{b}{c} /// {af}{bf}{cf} /// {af + bf}")
    err_cnt += 1

  episode += 1

print(f"err_cnt : {err_cnt}")