← 목록
기타 2026-06-22 2KB 읽기 3분

고정소수점v2 루트 오버플로 수정

개요

/Users/ef/CrownyOS/crownyc/libs/고정소수점v2.한선고정v2_루트 함수가 정수부 ≥5 입력에서 오버플로로 0/쓰레기값을 반환하던 버그를 수정했다.

근인

  1. 고정v2_루트 내부: N = v * SCALE을 직접 계산 → v=9\SCALE 이면 N≈2.82e11 > VM\_MAX(141.2G) 래핑.
  2. 고정v2_나눗셈 내부: 큰 나머지에 나머지 * SCALE → 나머지가 수백만 단위면 중간값이 역시 VM\_MAX 초과.

수정 내용 (3가지)

1. _SCALE_S1, _SCALE_S2 상수 추가

SCALE = 3^11 = 729(S1) × 243(S2)로 분해.

2. _ascale_div_b(a, b) 헬퍼 신설

(a * SCALE) / b를 두 단계로 계산해 VM\_MAX 초과 없음:
  • a * 729 → a ≤ 193.7M이면 안전
  • 나머지 243 → |나머지| ≤ |b|/2 ≤ 96.8M, 96.8M×243 = 23.5G < VM\_MAX

3. 고정v2_나눗셈 수정

a > 797161 경로에서 나머지 * 고정v2_SCALE 대신 _ascale_div_b(나머지, b) 호출.

4. 고정v2_루트 전면 재작성

  • 초기값: 루트(v) * 421 (내장 함수 double 정밀도, sqrt(SCALE)≈421)
  • 뉴턴 루프: 고정v2_나눗셈(v, x) 사용 (v\*SCALE 직접 계산 제거)
  • 진동 감지: 2스텝 전 값과 같으면 두 값 평균 반환
  • _트릿루트초기값 함수 제거 (dead code)

검증 결과

케이스결과오차(SCALE 단위)
sqrt(2)1.41421099 (≈5.6e-4)
sqrt(9)3.0000000
sqrt(100)10.0000000
sqrt(1000)31.62277780
sqrt(10000)100.0000000
sqrt(0.25)0.5000030
sqrt(0.5)0.70710227
sqrt(2)^21.999989
모두 PASS (허용 오차 500/177147 ≈ 0.003). 오버플로 경고 없음.

안전 입력 범위

정수부 최대 797,161 (= VM\_MAX / SCALE). 검증: sqrt(10000)=100.000000, sqrt(50000)=223.606795 모두 정확.

남은 한계

  • 정밀도 ~5.6e-6 (SCALE=3^11 고정, 확장 시 SCALE 변경 필요)
  • sqrt(0.25) 오차 0.000003 (0.003% 미만 — 허용 범위)
  • 정수부 > 797161: 이론적으로 _ascale_div_b가 b>193.7M에서 추가 오버플로 가능 (실용 범위 밖)

관련 파일

  • /Users/ef/CrownyOS/crownyc/libs/고정소수점v2.한선 — 수정된 라이브러리
  • /tmp/루트테스트v2_최종.한선 — 최종 회귀 테스트