파이썬에서 숫자가 다른 숫자에 근접하는지 확인하는 방법

PythonBeginner
지금 연습하기

소개

이 랩에서는 파이썬에서 숫자가 다른 숫자에 근접하는지 확인하는 방법을 배우고, 부동 소수점 숫자 비교의 어려움을 다룹니다. 먼저 수치적 근접성의 개념과 컴퓨터가 부동 소수점 숫자를 표현하는 방식 때문에 이것이 왜 중요한지 이해하는 것으로 시작합니다. 부동 소수점 숫자는 동일성을 비교할 때 예상치 못한 결과를 초래할 수 있습니다. 파이썬 스크립트는 0.1 + 0.2를 계산하고 결과를 0.3과 비교하여 이 개념을 설명하며, 부동 소수점 표현으로 인해 불일치가 발생할 가능성을 보여줍니다.

그런 다음 이 랩에서는 근접성을 결정하는 한 가지 방법으로 두 숫자 간의 절대 차이를 계산하는 방법을 안내합니다. 마지막으로, 상대적 및 절대적 허용 오차를 모두 고려하여 부동 소수점 숫자를 보다 강력하게 비교하기 위해 math.isclose() 함수를 사용하는 방법을 배우게 됩니다.

수치적 근접성 이해

이 단계에서는 수치적 근접성의 개념과 프로그래밍, 특히 부동 소수점 숫자를 다룰 때의 중요성을 살펴보겠습니다. 컴퓨터가 부동 소수점 숫자를 표현하는 방식 때문에, 부동 소수점 숫자는 종종 실수에 대한 근사치입니다. 이는 동일성을 비교할 때 예상치 못한 결과를 초래할 수 있습니다.

수치적 근접성은 두 숫자가 정확히 같지 않더라도 "충분히 가깝게" 같다고 간주할 수 있는지 판단하는 데 도움이 됩니다. 이는 부동 소수점 산술 연산을 포함하는 계산을 처리할 때 특히 유용합니다.

이 개념을 설명하기 위해 파이썬 스크립트를 만들어 보겠습니다.

  1. LabEx 환경에서 VS Code 편집기를 엽니다.

  2. ~/project 디렉토리에 proximity.py라는 새 파일을 만듭니다.

    ~/project/proximity.py
    
  3. proximity.py에 다음 코드를 추가합니다.

    ## proximity.py
    
    num1 = 0.1 + 0.2
    num2 = 0.3
    
    print(f"num1 is: {num1}")
    print(f"num2 is: {num2}")
    
    if num1 == num2:
        print("num1 and num2 are equal")
    else:
        print("num1 and num2 are not equal")
    

    이 스크립트는 0.1 + 0.2를 계산하고 결과를 0.3과 비교합니다.

  4. 파일을 저장하고 터미널에서 다음 명령을 사용하여 실행합니다.

    python ~/project/proximity.py
    

    다음과 유사한 출력을 볼 수 있습니다.

    num1 is: 0.30000000000000004
    num2 is: 0.3
    num1 and num2 are not equal
    

    보시다시피, 수학적으로 같아야 함에도 불구하고 num1num2는 부동 소수점 표현 때문에 정확히 같지 않습니다. 여기서 수치적 근접성의 개념이 중요해집니다. 다음 단계에서는 이 상황을 처리하는 방법을 살펴보겠습니다.

절대 차이 계산

이 단계에서는 두 숫자 간의 절대 차이를 계산하는 방법을 배우겠습니다. 절대 차이는 두 숫자 간의 차이의 크기이며, 순서에 관계없이 계산됩니다. 즉, 두 숫자 간의 양의 차이입니다.

파이썬에서 abs() 함수를 사용하여 절대 차이를 계산할 수 있습니다. abs() 함수는 숫자의 절대값을 반환합니다.

이전 단계에서 proximity.py 스크립트를 수정하여 num1num2의 절대 차이를 계산해 보겠습니다.

  1. VS Code 편집기를 사용하여 ~/project 디렉토리에서 proximity.py 파일을 엽니다.

  2. 절대 차이를 계산하도록 코드를 수정합니다.

    ## proximity.py
    
    num1 = 0.1 + 0.2
    num2 = 0.3
    
    print(f"num1 is: {num1}")
    print(f"num2 is: {num2}")
    
    absolute_difference = abs(num1 - num2)
    print(f"The absolute difference between num1 and num2 is: {absolute_difference}")
    
    if absolute_difference < 0.00001:  ## Using a small tolerance
        print("num1 and num2 are approximately equal")
    else:
        print("num1 and num2 are not approximately equal")
    

    이 코드에서는 abs() 함수를 사용하여 num1num2의 절대 차이를 계산합니다. 그런 다음 절대 차이를 작은 허용 오차 값 (이 경우 0.00001) 과 비교합니다. 절대 차이가 허용 오차보다 작으면 숫자가 대략적으로 같다고 간주합니다.

  3. 파일을 저장하고 터미널에서 다음 명령을 사용하여 실행합니다.

    python ~/project/proximity.py
    

    다음과 유사한 출력을 볼 수 있습니다.

    num1 is: 0.30000000000000004
    num2 is: 0.3
    The absolute difference between num1 and num2 is: 4.440892098500626e-17
    num1 and num2 are approximately equal
    

    이제 스크립트는 절대 차이와 허용 오차 값을 고려하여 num1num2가 대략적으로 같다는 것을 올바르게 식별합니다. 이 접근 방식은 부동 소수점 숫자를 직접 비교하여 동일성을 확인하는 것보다 더 강력합니다.

float 비교: math.isclose() 사용

이 단계에서는 math.isclose() 함수를 사용하여 부동 소수점 숫자의 근사적 동일성을 비교하는 방법을 배우겠습니다. math.isclose() 함수는 고정된 허용 오차를 사용하는 것보다 부동 소수점 숫자를 비교하는 데 더 강력하고 권장되는 방법입니다.

math.isclose() 함수는 두 개의 숫자를 입력으로 받아 지정된 허용 오차 내에서 서로 가깝다면 True를 반환하고, 그렇지 않으면 False를 반환합니다. 이 함수는 rel_tol (상대 허용 오차) 및 abs_tol (절대 허용 오차) 의 두 가지 허용 오차 매개변수를 제공합니다.

이전 단계에서 proximity.py 스크립트를 수정하여 math.isclose() 함수를 사용해 보겠습니다.

  1. VS Code 편집기를 사용하여 ~/project 디렉토리에서 proximity.py 파일을 엽니다.

  2. math.isclose()를 사용하도록 코드를 수정합니다.

    ## proximity.py
    
    import math
    
    num1 = 0.1 + 0.2
    num2 = 0.3
    
    print(f"num1 is: {num1}")
    print(f"num2 is: {num2}")
    
    if math.isclose(num1, num2):
        print("num1 and num2 are approximately equal")
    else:
        print("num1 and num2 are not approximately equal")
    

    이 코드에서는 math 모듈을 가져와 math.isclose() 함수를 사용하여 num1num2를 비교합니다. 대부분의 경우에 적합한 rel_tolabs_tol의 기본값을 사용합니다.

  3. 파일을 저장하고 터미널에서 다음 명령을 사용하여 실행합니다.

    python ~/project/proximity.py
    

    다음과 유사한 출력을 볼 수 있습니다.

    num1 is: 0.30000000000000004
    num2 is: 0.3
    num1 and num2 are approximately equal
    

    이제 스크립트는 math.isclose() 함수를 사용하여 num1num2가 대략적으로 같다는 것을 올바르게 식별합니다. 이는 파이썬에서 부동 소수점 숫자의 근사적 동일성을 비교하는 데 권장되는 방법입니다.

요약

이 Lab 에서는 파이썬에서 부동 소수점 숫자를 비교할 때 수치적 근접성 (numeric proximity) 의 개념과 그 중요성을 탐구하는 것으로 시작했습니다. 컴퓨터가 이러한 숫자를 표현하는 방식 때문에 직접적인 동일성 비교는 신뢰할 수 없을 수 있습니다. 우리는 이 문제를 보여주기 위해 proximity.py 스크립트를 만들었으며, 여기서 0.1 + 0.20.3과 비교되어 부동 소수점 표현으로 인해 정확히 같지 않다는 것을 보여주었습니다.

그런 다음 이 Lab 에서는 두 숫자가 동일하다고 간주될 만큼 "충분히 가까운지"를 결정하기 위한 대체 방법의 필요성을 소개하여, 후속 단계에서 절대 차이를 계산하는 것과 같은 기술을 탐구하기 위한 기반을 마련했습니다 (내용 잘림).