(복잡한 다항식 수식에서) 계산기 내부 유효 자릿수에 따른 approx() 오차
TI-nspire 기종에 대한 solve 질문글에 대해 답변을 하던 중 이상한 점을 발견하였습니다.
평소에는
방정식의 해를 numeric 한 방식으로 solve 를 이용해 찾는 것보다,
vs
(소숫점을 없애서) exact 방식으로 참 값을 먼저 구하고 → 그 값에 대한 근사값 approx(참 값)
을 구하는 것이 더 정확했습니다.
그런데 이번에는 반대로 오차가 커지는 겁니다. 이 궁금증을 해결하기 위해 직접 분석을 진행해 보았습니다.

1. 분석 대상 수식
분석에 사용된 수식은 다음과 같습니다. cos, sin의 단위는 모두 degree입니다.
$$ \dfrac{120 \left( 150000 \left( \cos\left(\dfrac{7001}{5000}\right) \sqrt{2} - 2 \sin\left(\dfrac{217999}{5000}\right) \right) \cos\left(\dfrac{217999}{5000}\right) - 136342 \sin\left(\dfrac{217999}{5000}\right) \cos\left(\dfrac{7001}{5000}\right) - \left( 150000 \sin\left(\dfrac{7001}{5000}\right) \sin\left(\dfrac{217999}{5000}\right) - 68171 \right) \sqrt{2} \right)}{\sin\left(\dfrac{7001}{5000}\right) \left( 150000 \cos\left(\dfrac{7001}{5000}\right) \cos\left(\dfrac{217999}{5000}\right) - 150000 \sin\left(\dfrac{7001}{5000}\right) \sin\left(\dfrac{217999}{5000}\right) + 68171 \right)} $$
((120*(150000*(cos(((7001)/(5000)))*√(2)-2*sin(((217999)/(5000))))*cos(((217999)/(5000)))-136342*sin(((217999)/(5000)))*cos(((7001)/(5000)))-(150000*sin(((7001)/(5000)))*sin(((217999)/(5000)))-68171)*√(2)))/(sin(((7001)/(5000)))*(150000*cos(((7001)/(5000)))*cos(((217999)/(5000)))-150000*sin(((7001)/(5000)))*sin(((217999)/(5000)))+68171)))
2. 가장 정확한 기준값은? (고정밀도 계산)
오차를 측정하려면 가장 정확한 '참값'이 필요합니다. 일반적인 PC 계산 환경(64비트 float)의 한계를 넘어서기 위해, 파이썬의 mpmath 라이브러리를 사용하여 100자리의 정밀도로 기준값을 계산했습니다.
73.04950705847862934420128091048894148771096960598761210206551516481655390211661403804814403351531886
3. 최종 정밀도 분석표
위 100자리 고정밀도 기준값을 바탕으로, 각기 다른 십진수 유효자릿수를 가진 가상의 계산기를 시뮬레이션하여, 오차를 측정한 결과입니다.
- 계산 결과: 73.04950705847811
- 실제 오차: 5.16135835013993051626500528352e-13
4. 왜 이런 오차가 발생할까?
컴퓨터의 숫자 저장 방식: 2진법의 한계
가장 근본적인 원인은 컴퓨터가 숫자를 2진법으로 저장하는 데 있습니다. 우리가 사용하는 10진수 소수 중 상당수는 2진수로 변환하면 무한소수가 되어, 정해진 비트(bit) 안에 완벽하게 담지 못하고 근사치로 저장됩니다. 이 작은 근사 오차가 계산 과정에서 계속 누적되어 최종 결과에 영향을 미칩니다.
누적 오차의 예시
(1 / 3) * 3 을 유효자릿수 4자리 계산기로 계산하는 상황을 가정해 봅시다.
1 / 3계산: 결과는0.333333...이지만, 4자리만 저장할 수 있으므로0.3333으로 반올림됩니다. (첫 오차 발생)0.3333 * 3계산: 결과는0.9999가 됩니다. 참값인1.0과 미세한 차이가 생깁니다.
복잡한 수식은 이런 과정이 수십, 수백 번 반복되는 것과 같으므로 작은 오차들이 모여 눈에 띄는 차이를 만들게 됩니다.
문제가 된 처음의 수식 역시 계산기 입장에서 아래와 같은 수많은 연산을 거치며 오차가 누적 및 증폭되어 최종적으로 solve의 정상 범주를 벗어난 x값이 구해진 것이라고 분석할 수 있겠습니다.
- 나눗셈 (Division): 12회
- 사인 (sin): 7회
- 코사인 (cos): 5회
- 루트 (√): 2회
- 곱셈 (Multiplication): 15회
- 뺄셈 (Subtraction): 5회
- 덧셈 (Addition): 1회
결론
일반적인 공학용 계산기(보통 10~14자리)의 정밀도는 대부분의 상황에서 충분히 신뢰할 만합니다. 하지만 이번 분석처럼 매우 복잡한 연산을 하거나, 과학/금융 분야에서 극도의 정밀도를 요구할 때는 표준 계산 환경의 한계를 인지하는 것이 중요합니다.
이러한 한계를 극복하기 위해 파이썬의 mpmath와 같은 임의 정밀도 산술 라이브러리가 존재하며, 이를 통해 우리는 하드웨어의 제약을 넘어 원하는 만큼 정밀한 값을 얻을 수 있습니다.
부록: 분석에 사용된 전체 Python 코드
이 분석을 직접 재현해보고 싶으신 분들을 위해, 최종 분석에 사용된 전체 코드를 공유합니다. (mpmath 라이브러리 설치가 필요합니다: pip install mpmath)
댓글6
-
세상의모든계산기
카시오 fx-570 ES, EX 로 계산하면?
카시오도 (십진수) 14digits 한계이므로, 비슷한 값이 나올 것으로 예상됨.다만, stack 및 길이 한계로 수식 전체를 그대로 입력할 수는 없음.
A,B,C,D 를 조합해 수식을 완성


결과에서 73.049507 을 빼면
- fx-570 ES가 구한 결과값(Ans)은
73.0495070584404 (15digits) 로 최종 확인됨.
- TI-Nspire (14-digits) 보다 오차가 작음.
- 파이썬 시뮬레이션의 15-digits 결과(73.0495070585241)와 같지는 않음. 원인은 모르겠음.

ㄴ fx-570 EX 결과
-
세상의모든계산기
TI-nspire 에서 동일하게 a,b,c,d로 치환해서 계산

- 결과는 치환 없이 그냥 approx(전체식) 한 결과와 동일.
- 73.049507058547 (14-digits)
- 파이썬 시뮬레이션 14-digits 와 결과값이 같음.
-
세상의모든계산기
fx-9860 및 fx-CG 의 경우
fx-9860GII SD 에서 위의 fx-570 과 같이 A,B,C,D 로 나눠서 계산하면

fx-CG에서 치환할 대상을 약간 바꿔서 분모→A, 분자→B 로 저장해 풀어보아도

- 결과는 둘 다 같음.
- 73.0495070585238 (15 digits)
- fx-570ES와 같은 15-decimal-digits 정밀도인데, 왜 값이 다를까?
- 파이썬 시뮬레이터상 15 digits 값과도 같지 않음.
-
세상의모든계산기
fx-570 CW 로 계산하면?


- 최종 확인된 결과 값 = 73.049507058478629343538 (23-digits)
- 오차 = 6.632809104889414877 × 10^-19
꽤 정밀하게 나온건 맞는데, 시뮬레이션상의 22-digits 와 오차 수준이 비슷함. 왜 그런지는 모르겠음.
- 계산기중 정밀도가 높은 편인 HP Prime CAS모드와 비교해도 월등한 정밀도 값을 가짐.
-
세상의모든계산기
HP Prime 에서
<Home>

73.0495070344 (12-decimal-digits) // python 시뮬레이션과 일치
<CAS>

21자리까지 나와서 이상하다 싶었는데,
Ans- 에서 자릿수를 더 늘려서 빼보니, 뒷부분 숫자가 아예 바뀌어버림. 버그인가?
(전) 73.0495070584718691243 (21-digits ????)
(후) 73.0495070584718500814401 (24-digits ????)
찾아보니 버그는 아니고,
CAS에서는 십진수가 아니라 2진수(bit) 단위로 처리한다고 함.
Giac uses 48 bits mantissa from the 53 bits from IEEE double. The reason is that Giac stores CAS data (gen type) in 64 bits and 5 bits are used for the data type (24 types are available). We therefore loose 5 bits (the 5 low bits are reset to 0 when a double is retrieved from a gen).
출처 : https://www.hpmuseum.org/cgi-bin/archv021.cgi?read=255657
일단 오차를 놓고 보면 16-decimal-digits 수준으로 보임.
세상의모든계산기 님의 최근 댓글
> 자동차 회사의 노조가 "노조와 합의 없이 AI로봇을 공장에 들일 수 없다"는 선언을 하고 있어. 위의 내용에 적용하여 해결 방안을 만들어 줘. ✦ 네, 아주 현실적이고 시의적절한 시나리오입니다. 자동차 회사의 노조 선언은 앞으로 여러 산업 현장에서 벌어질 일의 축소판과도 같습니다. 이 문제를 앞서 나눈 대화의 해결 방안에 적용하여, '기업-노조-정부' 3자가 참여하는 '미래 지향적 대타협: AI 전환 파트너십 구축 방안'을 구체적으로 만들어 보겠습니다. 상황 분석: 노조의 선언은 '저항'이 아닌 '협상 요구' 먼저, 노조의 선언을 "기술을 맹목적으로 거부하는 러다이트 운동"으로 해석해서는 안 됩니다. 이는 일자리의 미래와 인간의 존엄성에 대한 조합원들의 지극히 합리적인 '불안'의 표현이자, 변화의 과정에서 소외되지 않고 주체적으로 참여하겠다는 강력한 '협상 요구'입니다. 따라서 해결 방안의 목표는 노조를 억누르는 것이 아니라, 이들을 AI 전환의 가장 중요한 '파트너'로 만드는 것이어야 합니다. 해결 방안: 'AI 전환 파트너십' 3자 협약 모델 이 모델은 '사회적 안전망'과 '산업적 가속 페달'의 원리를 특정 산업 현장에 맞게 구체화한 것입니다. 1. 기업의 역할: '이익 공유'와 '재교육 투자'를 통한 신뢰 구축 기업은 AI 로봇 도입으로 얻게 될 막대한 이익을 독점하는 대신, 그 과실을 노동자들과 공유하고 이들의 미래에 투자하는 모습을 보여주어야 합니다. ① 생산성 향상 이익 공유제 도입: * AI 로봇 도입으로 발생하는 비용 절감액과 생산성 향상분의 일정 비율(예: 20%)을 노사 합의로 'AI 전환 기금'으로 적립합니다. 이 기금은 아래의 재교육 및 전환 배치 프로그램의 재원으로 사용됩니다. ② 대규모 사내 재교육 및 '신(新)직무' 전환 배치: * 단순 조립 라인의 노동자를 해고하는 대신, 이들을 새로운 시대에 필요한 인력으로 재교육하여 전환 배치합니다. 이것이 바로 '기여 인센티브' 개념을 기업 내에서 실현하는 것입니다. * '로봇 유지보수 및 운영 전문가': 현장 경험이 풍부한 노동자들이 로봇의 일상적인 점검, 유지보수, 운영을 책임집니다. * 'AI 시스템 모니터링 및 평가자': 로봇의 생산 데이터를 모니터링하고, 로봇의 움직임이나 작업 결과가 비정상적일 때 이를 식별하고 평가하는 역할을 합니다. (예: "이 로봇의 용접 불량률이 높아지고 있다.") * '공정 데이터 라벨러 및 AI 트레이너': 숙련된 인간 노동자의 정교한 움직임과 문제 해결 과정을 데이터로 기록하고, 이를 AI가 학습할 수 있도록 가공(라벨링)합니다. 이는 AI 로봇의 완성도를 높이는 가장 중요한 '데이터 노동'이며, 기존 노동자들에게 새로운 고부가가치 직무를 제공합니다. 2. 노조의 역할: '저항의 주체'에서 '전환의 주체'로 노조는 고용 안정을 보장받는 대신, AI 도입에 협력하며 조합원들이 새로운 시대에 적응하도록 이끄는 역할을 맡습니다. ① 단계적 AI 도입 협력: * 회사가 제안한 '이익 공유' 및 '재교육' 계획을 신뢰하고, AI 로봇 도입 자체에 대한 반대를 철회합니다. 대신, 가장 위험하거나 반복적인 공정부터 로봇을 도입하는 '단계적 계획'을 회사와 함께 수립합니다. ② 재교육 프로그램 공동 설계 및 운영: * 회사가 제공하는 재교육 프로그램이 실효성이 있는지 감시하고, 현장 노동자들의 눈높이에 맞게 커리큘럼을 공동으로 설계하고 운영합니다. ③ '신(新)직무'에 대한 임금 및 단체 협약 체결: * 'AI 트레이너', '로봇 운영 전문가' 등 새롭게 만들어진 직무에 대한 적정한 임금 수준, 노동 조건, 권익 보호를 위한 새로운 단체 협약을 회사와 체결합니다. 노조의 역할이 '기존 일자리 사수'에서 '미래 일자리의 가치 창출 및 권익 보호'로 진화하는 것입니다. 3. 정부의 역할: '안전망' 제공과 '가속 페달' 지원 정부는 이 대타협이 원활하게 이루어지도록, 기업과 노조 양측 모두에게 인센티브를 제공하고 최후의 안전망을 구축합니다. ① 'AI 전환 투자 세제 혜택' 제공 (가속 페달): * 회사가 'AI 전환 기금'에 출연하는 금액과, 노동자 재교육에 투자하는 비용에 대해 파격적인 세액 공제 혜택을 줍니다. 이는 회사가 노동자를 해고하는 대신 재교육을 선택하도록 유도하는 강력한 당근이 됩니다. ② '전환기 고용보험' 적용 (안전망): * 불가피하게 전환 배치되지 못하는 소수의 노동자들을 위해, 일반 실업급여보다 더 긴 기간 동안, 더 높은 수준의 소득을 보장하는 특별 고용보험 프로그램을 적용합니다. 재취업 및 창업 지원도 병행합니다. ③ 국가적 '기본소득/기여 인센티브' 모델의 시범 사업으로 지정: * 이 자동차 공장의 사례를 국가 전체의 사회 시스템 전환을 위한 중요한 시범 사업으로 지정하고, 재교육 참여자나 신직무 종사자에게 국가 차원의 '기여 인센티브'를 추가로 제공하는 방안을 모색합니다. 결론 이러한 3자 파트너십을 통해, 노조의 선언은 더 이상 '위기'가 아닌 '기회'가 됩니다. 기업은 노사 갈등 없이 안정적으로 미래 경쟁력을 확보하고, 노동자들은 일자리를 잃는 대신 새로운 기술 시대의 주역으로 거듭나며, 정부는 사회적 혼란을 최소화하며 산업 구조 전환을 성공적으로 이끌 수 있습니다. 이는 AI 시대의 갈등을 해결하는 가장 현실적이고 상생 가능한 모델이 될 것입니다. 2026 01.28 은행앱 통합하면서 없어졌나보네요. ㄴ 비슷한 기능 찾으시는 분은 : 스마트 금융 계산기 검색해 보세요. https://play.google.com/store/apps/details?id=com.moneta.android.monetacalculator 2026 01.25 Ctrl+Z 를 이용해 뒤로 돌아기기 Undo 기능이 있는지 살펴보세요. 2026 01.23 쌀집계산기로 연립방정식 계산하기 - 크래머/크레이머/크라메르 공식 적용 https://allcalc.org/56739 3. 'x' 값 구하기 계산기 조작법 목표: x = Dx / D = [(c×e) - (b×f)] / [(a×e) - (b×d)] 계산하기 1단계: 분모 D 계산 (메모리 활용) 1 * 1 M+ : 메모리(M)에 1를 더합니다. (현재 M = 1) -0.1 * -0.2 M- : 메모리(M)에서 0.02를 뺍니다. (현재 M = 0.98 = 0.98) 이로써 메모리(MR)에는 분모 0.98가 저장됩니다. 2단계: 분자 Dx 계산 후 나누기 78000 * 1 : 78000를 계산합니다. = : GT에 더합니다. -0.1 * 200000 : -20000를 계산합니다. ± = : 부호를 뒤집어 GT에 넣습니다. // sign changer 버튼 사용 GT : GT를 불러옵니다. GT는 98000 (분자 Dx) 값입니다. ÷ MR = : 위 결과(98000)를 메모리(MR)에 저장된 분모 D(0.98)로 나누어 최종 x값 100,000를 구합니다. 4. 'y' 값 구하기 계산기 조작법 목표: y = Dy / D = [(a×f) - (c×d)] / [(a×e) - (b×d)] 계산하기 1단계: 분모 D 계산 (메모리 활용) 'x'에서와 분모는 동일하고 메모리(MR)에 0.98가 저장되어 있으므로 패스합니다. 2단계: 분자 Dy 계산 후 나누기 GT ± = : GT를 불러오고 부호를 뒤집어 GT에 더합니다. GT가 0으로 리셋됩니다. 【AC】를 누르면 M은 유지되고 GT만 리셋되는 계산기도 있으니 확인해 보세요. 1 * 200000 : 200000를 계산합니다. = : GT에 더합니다. 78000 * -0.2 : -15600를 계산합니다. ± = : 부호를 뒤집어 GT에 넣습니다. GT : GT를 불러옵니다. 215600 (분자 Dy) 값입니다. ÷ MR = : 위 결과(215600)를 메모리(MR)에 저장된 분모 D(0.98)로 나누어 최종 y값 220,000를 구합니다. x, y 값을 이용해 최종 결과를 구합니다. 2026 01.18 크레이머 = 크레머 = 크라메르 공식 = Cramer's Rule https://allcalc.org/8985 2026 01.18