VM "0+float" 정수 반올림 근본 버그 수정 (2026-07-10)
개요
P1 재측정 최대 keystone으로 지목된 VM float 정밀도 버그(부동소수·선형회귀·RK4·통계 정밀도가 이 우회로 partial에 묶여있던 문제)의 근본원인을 확정하고 최소 패치로 수정.
무엇을 했는지
- 작업지시서의 최초 가설("ADD/SUB opcode가 IS_FLOAT 분기 없이 cube_add/cube_sub로
- 디버그 계측(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양쪽에 동일 패치 적용, 각각
검증 결과 (상세는 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스텝
관련 파일
/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,
pkg make test의 셀3축/셀DB 2건 실패도 float 무관, 별도 이슈.- crownyc.c는 정본 C VM 코드라 "한선씨 동반 필수" 훅이 매번 뜨지만, 이 함수는 VM