고정소수점v2 루트 오버플로 수정
개요
/Users/ef/CrownyOS/crownyc/libs/고정소수점v2.한선의 고정v2_루트 함수가
정수부 ≥5 입력에서 오버플로로 0/쓰레기값을 반환하던 버그를 수정했다.
근인
고정v2_루트내부:N = v * SCALE을 직접 계산 → v=9\SCALE 이면 N≈2.82e11 > VM\_MAX(141.2G) 래핑.고정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.414210 | 99 (≈5.6e-4) |
| sqrt(9) | 3.000000 | 0 |
| sqrt(100) | 10.000000 | 0 |
| sqrt(1000) | 31.622777 | 80 |
| sqrt(10000) | 100.000000 | 0 |
| sqrt(0.25) | 0.500003 | 0 |
| sqrt(0.5) | 0.707102 | 27 |
| sqrt(2)^2 | 1.999989 | — |
안전 입력 범위
정수부 최대 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_최종.한선— 최종 회귀 테스트