Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

Python ValueError: math domain error 발생 원인과 해결 방법

수학에는 음수나 0에 대해 수행할 수 없는 연산이 존재합니다. 대표적인 예가 바로 제곱근입니다. 음수의 제곱근은 구할 수 없죠. 파이썬 역시 모든 연산이 음수나 0에서 동작하는 것은 아니라는 사실을 인식하고 있습니다.

따라서 지원하지 않는 연산에 음수를 사용하려고 하면 파이썬은 오류를 발생시킵니다. 이번 글에서는 ValueError: math domain error의 발생 원인을 살펴보고, 마지막에는 이 문제를 해결하는 방법까지 단계별로 알아보겠습니다.

ValueError: math domain error란?

ValueError: math domain error는 수학 연산이 지원하지 않는 값을 사용할 때 발생하는 오류입니다. 이 오류는 주로 sqrt()(제곱근) 메서드나 log()(로그) 메서드를 사용할 때 자주 나타납니다.

ValueError는 해당 연산에 적합하지 않은 값으로 수학 연산을 수행하고 있음을 알려주는 오류 유형입니다. "math domain error"의 경우, 음수 또는 0을 사용해서는 안 되는 곳에 그런 값을 사용했다는 의미입니다.

그럼 실제로 ValueError: math domain error가 어떻게 발생하는지 예제를 통해 확인해 보겠습니다.

오류 발생 예제

주어진 숫자의 제곱근을 계산하는 프로그램을 만들어 보겠습니다. 이 프로그램은 학생들이 제곱근 개념을 복습하고 스스로 푼 답을 검증할 수 있도록 돕기 위해 설계되었습니다.

먼저 제곱근을 계산하기 위해 필요한 math 라이브러리를 임포트합니다:

import math

다음으로 사용자로부터 숫자를 입력받습니다:

number = input("먼저 종이와 연필로 문제를 풀어본 후, 제곱근을 확인하고 싶은 숫자를 입력하세요: ")

프로그램의 목적이 사용자가 직접 푼 답을 검증하는 것이므로, 먼저 스스로 풀어보도록 안내하는 메시지를 함께 출력합니다. 다음으로 사용자가 입력한 값의 제곱근을 구합니다:

answer = math.sqrt(int(number))

"number" 변수에 저장된 값을 정수형으로 변환합니다. 앞서 숫자를 입력받을 때 사용한 input() 메서드는 문자열을 반환하기 때문에 이 변환이 필수적입니다. 문자열의 제곱근은 구할 수 없기 때문입니다.

마지막으로 결과를 콘솔에 출력합니다:

print("The square root of {} is {}.".format(number, answer))

format() 문을 사용해 문자열에 숫자를 삽입합니다. 출력되는 문자열은 다음과 같은 형태입니다:

"[사용자가 입력한 숫자]의 제곱근은 [프로그램이 계산한 제곱근]입니다."

이번에는 음수를 입력해서 프로그램을 테스트해 보겠습니다:

먼저 종이와 연필로 문제를 풀어본 후, 제곱근을 확인하고 싶은 숫자를 입력하세요: -16
Traceback (most recent call last):
  File "test.py", line 5, in <module>
    answer = math.sqrt(int(number))
ValueError: math domain error

프로그램에 -16을 입력했더니 코드가 오류를 반환했습니다. 이제 이 오류를 수정해 보겠습니다.

해결 방법

이 오류를 해결하려면 math.sqrt() 함수를 실행하기 전에, 입력값이 음수인지 먼저 검사하는 로직을 추가해야 합니다. 음수의 제곱근은 계산할 수 없으므로, 유효한 값인지 확인한 후에 함수를 호출하는 것이 올바른 접근입니다.

코드를 다음과 같이 수정해 보겠습니다:

import math

number = input("먼저 종이와 연필로 문제를 풀어본 후, 제곱근을 확인하고 싶은 숫자를 입력하세요: ")

if int(number) >= 0:
    answer = math.sqrt(int(number))
    print("The square root of {} is {}.".format(number, answer))
else:
    print("0보다 작은 숫자의 제곱근은 구할 수 없습니다.")

if 문을 사용해 사용자가 입력한 숫자가 0보다 크거나 같은지 확인합니다. 조건을 만족하면 if 문 내부의 코드가 실행되어 제곱근을 계산하고, 그렇지 않으면 else 문이 실행되어 유효하지 않은 숫자를 입력했다는 안내 메시지를 보여줍니다.

프로그램을 다시 실행해 보겠습니다. 실행 결과는 다음과 같습니다:

먼저 종이와 연필로 문제를 풀어본 후, 제곱근을 확인하고 싶은 숫자를 입력하세요: -16
0보다 작은 숫자의 제곱근은 구할 수 없습니다.

더 이상 오류가 발생하지 않고, 코드가 정상적으로 동작합니다.

추가 팁: cmath 모듈 활용하기

만약 음수의 제곱근도 다뤄야 하는 상황이라면 cmath 모듈을 사용하는 방법도 있습니다. cmath.sqrt(-16)처럼 호출하면 복소수 형태의 결과인 4j를 반환하므로, 오류 없이 음수의 제곱근을 계산할 수 있습니다. 다만 일반적인 실수 범위의 계산이 필요하다면 위에서 소개한 것처럼 입력값을 검증하는 방식이 더 적절합니다.

마무리

ValueError: math domain error는 계산할 수 없는 음수나 0에 대해 수학 함수를 수행할 때 발생합니다. 이 오류를 해결하려면 사용 중인 수학 함수에 유효한 숫자를 전달하고 있는지 반드시 확인해야 하며, if 문으로 입력값을 사전에 검증하는 습관을 들이면 이런 오류를 손쉽게 예방할 수 있습니다.