← 목록
컴파일러 2026-07-23 4KB 읽기 5분

hanseonc_rpn.c에 float(소수점) 리터럴 지원 추가

개요

크라우니워드프로세서 RPN 정본화 중 발견된 결손: hanseonc_rpn.c(RPN 한선씨 컴파일러)가 소수점 리터럴을 미지원(757행 strtol2.832로 조용히 절단). 고수준 컴파일러(hanseonc_high.c 1985~2031행)가 쓰는 TFloat 균형3진 큐브 인코딩 산식을 그대로 이식했다.

무엇을 했는지

수정

/Users/ef/CrownyOS/crownyc/hanseonc_rpn.c "4. 숫자 리터럴" 분기(구 756~761행)를 strtol+endptr로 소수점 판정(. 뒤 숫자 1개 이상, high 732행과 동일 파리티, e표기 미지원) 후 float면 hanseonc_high.c 1985~2031행 산식(맨티사 정규화 3^18/2 근사· ±364 지수 한계·균형3진 트릿 변환·t[24]=A/t[25]=T/t[26]=T 마커)을 그대로 이식, 정수면 기존 strtol+buf_emit_data 경로 완전 유지.

검증 (5단계)

  1. 빌드: cc -O2 -o hanseonc_rpn hanseonc_rpn.c 경고 0.
  2. 단위(큐브 바이트 동일성): 2.83, -0.5, 0.0001, 123456.789 — high/rpn 두
컴파일러가 방출한 TFloat 데이터 큐브 27트릿이 바이트 완전 동일(PASS 4/4). 정수 회귀용 42, -7은 high↔rpn 간 t[24..26] 마커가 애초부터 다름(TYPE_NUM 매크로 정의가 두 컴파일러에서 서로 다른 상수—float 작업과 무관한 기존 불일치, 신버전/구버전 rpn 바이너리 간에는 완전 동일이라 이번 패치의 회귀 아님을 확인).
  1. 실행: crownyc run으로 high/rpn 각각 문자열변환() 출력 비교 —
2.83 / -0.5 / 0.0001 / 123457(=%g 6자리, 기존 동작) / 42 / -7 완전 일치.
  1. 66파일 전수 회귀: /Users/ef/crowny-word/도구/*.rpn.한선 66개를 구버전
(hanseonc_rpn.bak-prefloat)·신버전 각각 컴파일 → .toau md5 66/66 완전 동일 (정수 경로 무변경 확인).
  1. 차단 해제 실증(PDF텍스트): PDF텍스트.한선(2.834645669 리터럴 보유)을
tools/clike_to_rpn.한선(현재 정본 — 구 .py_삭제됨_python/으로 이관됨, 실행 안 함)으로 변환 → 신버전 hanseonc_rpn으로 컴파일 성공(exit 0, 8869 cubes) + crownyc run 실행 성공, 자체 검사 31/36 PASS. - 발견된 별개 결손(수정 안 함, 범위 밖): clike_to_rpn.한선 자체가 2.834645669 같은 소수 리터럴을 2 "834645669" 맵꺼내 곱해로 오변환하고 (FAIL MM을PT_A4폭 실제=-210 기대=595), } 혹시 (c == "\\") {처럼 백슬래시 문자열 비교가 낀 else-if 체인을 변환하지 못하고 원문 그대로 흘려보낸다 (컴파일 시 "미인식 단어" 경고 다수). 둘 다 hanseonc_rpn.c가 아니라 tools/clike_to_rpn.한선 컨버터 자체의 결손 — 이번 태스크 범위 밖, 별도 담당으로 이관.

동반 한선씨 파일

/Users/ef/CrownyOS/crownyc/hanseonc_rpn_float.한선 — C 산식(맨티사 정규화+균형3진 트릿 변환)을 독립 재구현. 정답셋은 hanseonc_high 실컴파일 큐브를 디코딩해 확보 (2.83→맨티사121822220/지수-16, -0.5→-64570081/-17, 0.0001→84728861/-25, 123456.789→89999999/-6). crownyc run 결과 16/16 PASS(맨티사·지수·양쪽 라운드트립 전부).

관련 파일

  • /Users/ef/CrownyOS/crownyc/hanseonc_rpn.c (수정본)
  • /Users/ef/CrownyOS/crownyc/hanseonc_rpn.c.bak-20260722-float전 (수정 전 백업)
  • /Users/ef/CrownyOS/crownyc/hanseonc_rpn.bak-prefloat (구버전 바이너리, 회귀 대조용)
  • /Users/ef/CrownyOS/crownyc/hanseonc_rpn_float.한선 (교차검증 동반 파일)
  • /Users/ef/crowny-word/도구/PDF텍스트.rpn.한선 (신규 변환 산출물 — 컨버터 결손 포함 상태로 존재)

잔여 이슈

  • tools/clike_to_rpn.한선 컨버터의 소수점 리터럴 오변환 + 백슬래시 비교
else-if 미변환 버그(위 상세) — hanseonc_rpn.c 범위 밖, 후속 담당 필요.
  • hanseonc_high.c와 hanseonc_rpn.c의 정수 리터럴 마커 트릿(t[24..26])이
서로 다른 상수를 쓰는 기존 불일치 발견(TYPE_NUM: high=T(1), rpn=0) — 두 컴파일러가 방출한 정수 데이터 큐브 자체는 각자 내부적으로 일관되게 사용되므로 기능 오류는 아니나, 향후 "정수 큐브도 바이트 동일"을 요구하는 검증에서는 걸릴 수 있음. 이번 태스크(float 전용) 범위 밖이라 미수정.

크라우니코드: lookup HIT 0건 / MISS 1건(TFloat균형3진인코딩, 신규 생성) / learn 추가 1건