본문 바로가기
컴퓨터이야기/파이썬프로그래밍

부동소수점 오류 간단한 예시 sin(θ)^2+cos(θ)^2=1

by Saltycrocodile 2025. 3. 4.

 

수학적으로는 항상

이 성립함을 알고 있다. 이런 수식을 검증하도록 하는 파이썬 코드를 만들어보자

 

import sys
import stdio
import math

x = int(sys.argv[1])

y = (math.cos(x))**2+(math.sin(x))**2

stdio.writeln(y)

 

그리고 y를 입력해서 답을 확인해보자 

 

 

 

여기에 나오는 것과 같이 어떤 경우에는 1.0으로 잘 변환하다가 어떤 경우에는 0.9999999999999999 처럼 이상한 답을 내놓는다. 이는 부동소수점 오류 때문이다. 

 

부동소수점 오차 때문에 일부 경우에는 0.9999999999999999처럼 1보다 아주 약간 작은 값이 나올 수 있는 것이다.

 

이런 문제를 해결하기 위해선 

 

1.

y = round((math.cos(x))**2 + (math.sin(x))**2, 10)

 

2.

import math

if math.isclose(y, 1.0, rel_tol=1e-9):
    print("y는 1과 매우 가까운 값입니다.")

 

이런 식으로 round()함수나 math.isclose()함수를 사용해서 부동소수점 문제를 해결할 수도 있다. 

 

import sys
import math

x = int(sys.argv[1])

y = (math.cos(x))**2 + (math.sin(x))**2

y = round(y, 10)  # 소수점 10자리까지 반올림

print(y)

 

y를 바로 출력하지말고 round(y,10)으로 반올림을 해서 부동소수점 문제를 해결했다.

writeln 함수를 빼기 위해 stdio모듈을 없애고 그냥 print()함수로 출력한다.

 

참고로 round(y, 10)은 소수점 10자리까지 반올림이라는 것이며 이 의미는 다음과 같다.

 

숫자 1.2345678912345가 있다고 가정하자.

 

1.2345678912345

소수점 10번째 자리(2)까지 남기고, 이후 숫자는 버림 또는 반올림됨.

1.2345678912

 

1.2345678912345

소수점 3번째 자리(4)까지 남기고, 이후 숫자는 반올림되어 5가 됨.

→ 1.235