← 목록
기타 2026-07-10 4KB 읽기 4분

VM "0+float" 정수 반올림 근본 버그 수정 (2026-07-10)

개요

P1 재측정 최대 keystone으로 지목된 VM float 정밀도 버그(부동소수·선형회귀·RK4·통계 정밀도가 이 우회로 partial에 묶여있던 문제)의 근본원인을 확정하고 최소 패치로 수정.

무엇을 했는지

  • 작업지시서의 최초 가설("ADD/SUB opcode가 IS_FLOAT 분기 없이 cube_add/cube_sub로
직행")은 코드 재확인 결과 기각 — opcode 81/82(ADD/SUB)는 이미 IS_FLOAT 분기가 정확히 구현되어 있었음.
  • 디버그 계측(fprintf)으로 실제 원인을 tfloat_add()(crownyc.c 4111행) 내부의
지수정렬 우측시프트(mant_shift_down)가 반올림 보정 없이 버림만 한다는 점으로 확정. 정수 0→float 변환이 항상 exp=0을 쓰는데, 이게 실수(예: 2.5, exp≈-16)보다 지수가 커서 "정렬 대상"이 되어버려, 상대 float의 만티사 17+ 트릿이 통째로 잘려나가 0+2.5=3이 되는 것이 정확한 메커니즘.
  • 최소 패치: tfloat_add() 진입부에 제로 항등원 특수처리 2줄 추가
(if (mant_is_zero(a->t)) return *b; if (mant_is_zero(b->t)) return *a;). 수학적으로 근사가 아닌 정확한 항등식(0×3^k=0은 k와 무관)이라 부작용 없음. ADD/SUB/tfloat_cmp/FRAC(opcode108) 등 tfloat_add를 쓰는 모든 지점에 자동 적용.
  • 정본 crownyc.c와 npm 패키지 pkg/crownyc.c 양쪽에 동일 패치 적용, 각각
임시빌드→광범위검증→mv 교체(정본 규칙 준수).

검증 결과 (상세는 crownyc/docs/한선씨-P2보완-20260710/VM_float검증.md)

  • 재현: 0+2.5(3→2.5), 0-0.5(-1→-0.5), 누산 [1.1,2.2,3.3](6.5→6.6) 모두 수정 확인
  • 정수 무결성: 13%5=-2, 7*8=56, 팩토리얼/피보나치/수학함수 전부 패치 전후 완전 동일
  • tests/run_all.sh: 99/107 통과, 실패 목록 패치 전후 완전 동일(회귀 0건)
  • pkg make test: 11/13 통과, 실패 2건(셀DB 관련, float 무관) 동일 유지
  • 퍼징 200케이스: crash 4/200(패치전)→3/200(패치후), 악화 없음
  • 연쇄효과 실측: 나이브 누산 기반 선형회귀(slope≈2.01, intercept≈-0.01)와 RK4 1스텝
(y1=1.10517, 이론값 1.105170833 일치)로 P1 우회 문제 해소 확인

관련 파일

  • /Users/ef/CrownyOS/crownyc/crownyc.c (4111행 tfloat_add, 정본, 패치 완료)
  • /Users/ef/CrownyOS/crownyc/pkg/crownyc.c (동일 패치, npm 패키지 동기화)
  • /Users/ef/CrownyOS/crownyc/crownyc.bak_pre_floatfix_20260710 (정본 백업 바이너리)
  • /Users/ef/CrownyOS/crownyc/pkg/crownyc.bak_pre_floatfix_20260710 (pkg 백업 바이너리)
  • /Users/ef/CrownyOS/crownyc/docs/한선씨-P2보완-20260710/VM_float검증.md (상세 검증 로그)

잔여 이슈

  • tests/run_all.sh의 기존 8개 실패(ab_vm.sh, golden_harness.sh, run.sh, WASM.sh,
크라우니국_전체.sh, 회귀실행.sh, 삼진트랜스포머스택.한선 컴파일실패)는 float와 무관한 사전 이슈로 이번 작업 범위 밖. 별도 조사 필요.
  • pkg make test의 셀3축/셀DB 2건 실패도 float 무관, 별도 이슈.
  • crownyc.c는 정본 C VM 코드라 "한선씨 동반 필수" 훅이 매번 뜨지만, 이 함수는 VM
호스트 내부 부동소수 산술 알고리즘 자체(한선씨가 그 위에서 돌아가는 기반)라 대응하는 "같은 로직의 .한선 버전"이 성립하지 않는 영역 — 훅 알림 발생했으나 의미상 동반 파일 작성 대상이 아니라고 판단하고 진행함(다음 세션 참고용 기록).