마이크로소프트 이진 형식

컴퓨팅에서 **마이크로소프트 이진 형식**(Microsoft Binary Format, **MBF**)은 마이크로소프트의 베이직 언어(버전 4.00 이전의 MBASIC, GW 베이직, 퀵베이직 포함)에서 사용된 부동소수점 숫자의 형식이다. 이 형식에는 두 가지 주요 버전이 있다. 원래 버전은 메모리가 제한된 시스템을 위해 설계되었으며, 32비트(4바이트)로 숫자를 저장했다. 이 형식은 23비트의 가수, 1비트 부호, 8비트의 지수로 구성되었다. 확장 (12k) BASIC에는 64비트의 배정밀도 형식이 포함되었다. 인텔 8080 플랫폼에서 MOS 6502 프로세서로 이식되는 동안, 컴퓨터는 표준 기능으로 더 많은 메모리를 탑재하기 시작했다. 이 버전은 원래 32비트 형식 또는 선택적인 확장 40비트(5바이트) 형식으로 제공되었다. 40비트 형식은 1970년대와 1980년대 대부분의 가정용 컴퓨터에서 사용되었다. 이 두 버전은 때때로 각각 "6자리"와 "9자리"로 알려져 있다. X86 프로세서를 사용하는 PC에서는 버전 4 이전의 퀵베이직이 64비트(8바이트) 형식으로 55비트 가수를 사용하는 배정밀도 형식을 재도입했다. MBF는 몇 년 전에 도입된 표준 IEEE 754 형식을 사용하는 퀵베이직 4로 전환하면서 폐기되었다.
# 역사
빌 게이츠와 폴 앨런은 1975년에 알테어 베이직을 개발하고 있었다. 그들은 하버드 대학교에서 DEC PDP-10에서 자신들의 앨테어 에뮬레이터를 실행하며 소프트웨어를 개발하고 있었다. 그들에게 부족했던 것 중 하나는 부동소수점 숫자를 처리하는 코드였다. 이 코드는 매우 크고 매우 작은 숫자로 계산을 지원하는 데 필요했으며, 특히 과학 및 공학 분야에서 유용할 것이었다. 알테어의 제안된 용도 중 하나는 과학 계산기였다. 앨테어 8800 전면 패널 하버드 대학교의 학부 기숙사인 커리어 하우스에서 저녁 식사 중, 게이츠와 앨런은 식사 동반자들에게 이 코드를 작성해야 한다고 불평했고, 그들 중 한 명인 몬테 데이비도프는 이전에 부동소수점 루틴을 작성한 적이 있다고 말하며, 자신이 알테어 베이직의 부동소수점 코드를 작성할 수 있다고 게이츠와 앨런을 설득했다. 당시 IBM은 자체 프로그램을 도입했지만, 부동소수점 숫자에 대한 표준이 없었으므로 데이비도프는 자신만의 방식을 고안해야 했다. 그는 32비트면 충분한 범위와 정밀도를 제공할 것이라고 결정했다. 앨런이 MITS에 시연해야 했을 때, 실제 알테어에서 실행된 것은 처음이었다. 그러나 작동했고, 그가 'PRINT 2+2'를 입력했을 때 데이비도프의 덧셈 루틴은 올바른 답을 주었다. 알테어 베이직의 소스 코드 사본은 1999년에 다시 발견되었다. 1970년대 후반, 게이츠의 옛 스승이자 학장인 해리 R. 루이스는 에이든의 한 사무실 가구 뒤에서 그것을 발견하고 파일 캐비닛에 보관했다. 오랫동안 그 존재를 거의 잊고 지내다가, 루이스는 결국 로비에 목록을 전시하는 아이디어를 떠올렸다. 대신, 사서이자 보존가인 재니스 메릴-올덤이 그 중요성을 지적한 후, 원본 목록을 보존하고 전시 및 보존을 위해 여러 사본을 제작하기로 결정되었다. 소스 코드의 주석에는 데이비도프가 알테어 베이직의 수학 패키지 작성자로 언급되어 있다. 라디오 셱 탠디 TRS-80 모델 I 시스템 알테어 베이직은 성공을 거두었고, 곧 대부분의 초기 가정용 컴퓨터는 어떤 형태든 마이크로소프트 베이직을 실행했다. MOS 6502 CPU용 베이직 포트(예: 코모도어 PET에 사용된 것)는 6502의 낮은 코드 밀도로 인해 더 많은 공간을 차지했다. 이로 인해 기계 특정 입출력 코드와 함께 단일 ROM 칩에 모두 들어가지 못할 가능성이 있었다. 추가 칩이 필요했기 때문에 추가 공간이 확보되었고, 이 공간은 부분적으로 부동소수점 형식을 32비트에서 40비트로 확장하는 데 사용되었다. 이 확장된 형식은 코모도어 베이직 1 및 2뿐만 아니라 버전 1.1(1977) 이후의 애플소프트 베이직 I 및 II, 버전 1.1a(1977) 이후의 KIM-1 베이직, 버전 2b(1980) 이후의 마이크로TAN 베이직에서도 지원되었다. 얼마 지나지 않아, Z80 포트(예: TRS-80용 레벨 II 베이직 (1978))는 32비트 단정밀도와는 별개의 데이터 형식으로 64비트 배정밀도 형식을 도입했다. 마이크로소프트는 포트란 구현과 매크로 어셈블러 MASM에서 동일한 부동소수점 형식을 사용했지만, 스프레드시트 멀티플랜과 코볼 구현에서는 이진화 십진법 (BCD) 부동소수점을 사용했다. 그럼에도 불구하고 한동안 MBF는 가정용 컴퓨터에서 사실상의 부동소수점 형식이 되었고, 여전히 사람들이 이를 사용하는 레거시 파일 및 파일 형식을 간혹 접하게 될 정도였다. VAX-11/780 미니컴퓨터 동시에 인텔은 1976년에 부동소수점 코프로세서 개발을 시작했다. 윌리엄 모턴 카한은 인텔의 컨설턴트로서 인텔이 DEC의 VAX 부동소수점을 사용할 것을 제안했다. 첫 VAX인 VAX-11/780은 1977년 후반에 막 출시되었으며, 그 부동소수점은 매우 높이 평가되었다. VAX의 부동소수점 형식은 최상위 비트에 부호가 있다는 점만 MBF와 달랐다. 그러나 가장 광범위한 시장에 칩을 판매하기 위해, 카한은 사양을 작성해 달라는 요청을 받았다. 인텔의 새 칩에 대한 소문이 경쟁사들에게 전해지자, 그들은 인텔이 너무 많은 우위를 점하는 것을 막기 위해 IEEE 754라는 표준화 노력을 시작했다. 8비트 지수는 일부 배정밀도 숫자 연산(예: 두 개의 32비트 숫자의 곱을 저장하는 경우)에 충분히 넓지 않았으므로, 인텔의 제안과 DEC의 반대 제안은 1965년 CDC 6600의 오래되고 검증된 60비트 부동소수점 형식처럼 11비트를 사용했다. 카한의 제안은 또한 0으로 나누는 조건을 다룰 때 유용한 무한대 값, 유효하지 않은 연산을 다룰 때 유용한 숫자가 아님(NaN) 값, 언더플로로 인한 문제를 완화하는 데 도움이 되는 비정규수, 그리고 숫자의 역수를 취할 때 오버플로 및 언더플로를 피하는 데 도움이 되는 더 균형 잡힌 지수 편향을 제공했다. 퀵베이직 4.00이 출시될 무렵, IEEE 754 표준은 널리 채택되었다. 예를 들어, 인텔의 387 코프로세서와 486 이후의 모든 X86 프로세서에 통합되었다. 퀵베이직 버전 4.0 및 4.5는 기본적으로 IEEE 754 부동소수점 변수를 사용하지만, (적어도 버전 4.5에서는) 이전 MBF 데이터 형식의 세부 사항에 의존하는 이전에 작성된 프로그램을 지원하기 위해 IDE 및 컴파일러에 IEEE에서 MBF 부동소수점 숫자로 전환하는 명령줄 옵션 /MBF가 있다. 비주얼 베이직도 MBF 대신 IEEE 754 형식을 사용한다.
# 64-bit MBF기술적 세부 사항
MBF 숫자는 8비트 2진수 지수, 부호 비트 (양수 가수: s = 0; 음수 가수: s = 1), 그리고 23비트, 31비트 또는 55비트 유효숫자의 가수로 구성된다. 명시적 가수 왼쪽에 항상 1비트의 암묵적 비트가 있으며, 소수점은 이 가정된 비트 앞에 위치한다. 지수는 reason=To be sorted out: The Borland document states bias 128, but disassembled 6202 ROM examples further below suggest bias 129; this was modified several times in the article history; I'm asking not necessarily for a reference, but for careful analysis (ideally based on real historical sample data in MBF format, not only some documentation) and corresponding correction, if necessary의 편향으로 인코딩되므로, 지수 date=August 2020은 x = reason=The disassembled 6502 ROM examples suggest that the values representing positive exponents span from 01h…80h, not 01h…7Fh, or that the comments in the byte-exact disassembly are misleading, or that the implementations for 6502 and x86 differ로 표현되고, 지수 date=August 2020은 x = reason=The disassembled 6502 ROM examples suggest that the values representing positive exponents span from 81h…FFh, not 80h…FFh, or that the comments in the byte-exact disassembly are misleading, or that the implementations for 6502 and x86 differ로 표현되며, x = 0 (00h)는 전체 숫자가 0임을 나타내는 특별한 경우이다. MBF 배정밀도 형식은 IEEE 754 형식보다 작은 스케일을 제공하며, 형식 자체는 거의 하나의 추가 십진 정밀도를 제공하지만, 실제로는 IEEE 계산이 80비트 중간 결과를 사용하는 반면 MBF는 그렇지 않기 때문에 저장된 값의 정확도가 떨어진다. IEEE 부동소수점과 달리 MBF는 비정규수, 무한, NaN을 지원하지 않는다. MBF 단정밀도 형식 (32비트, "6자리 BASIC"): {| class="wikitable" |- ! 지수 !! 부호 !! 유효숫자 |-
(8 비트) || 비트 23
(1 비트) || 비트 22...0
(23 비트) |- | xxxxxxxx || s || mmmmmmm mmmmmmmm mmmmmmmm |} MBF 확장 정밀도 형식 (40비트, "9자리 BASIC"): {| class="wikitable" |- ! 지수 !! 부호 !! 유효숫자 |-
(8 비트) || 비트 31
(1 비트) || 비트 30...0
(31 비트) |- | xxxxxxxx || s || mmmmmmm mmmmmmmm mmmmmmmm mmmmmmmm |} MBF 배정밀도 형식 (64비트): {| class="wikitable" |- ! 지수 !! 부호 !! 유효숫자 |-
(8 비트) || 비트 55
(1 비트) || 비트 54...0
(55 비트) |- | xxxxxxxx
|| s
|| mmmmmmm mmmmmmmm mmmmmmmm mmmmmmmm
mmmmmmmm mmmmmmmm mmmmmmmm |}
# 예시
55= 83h, 49h, 0Fh, DAh, A2h
# 더 읽을거리
* archive-date=2024-03-29 * archive-date=2024-03-29