8 비트 Basic이 40 비트 부동 소수점을 사용하는 이유는 무엇입니까?

Nov 13 2020

요즘 부동 소수점은 일반적으로 32 비트 또는 64 비트, 때로는 16 비트, 때로는 128 비트입니다. 그러나 물론 8 비트 시스템의 기본 인터프리터는 소프트웨어에서 부동 소수점을 구현해야합니다. 8 개 또는 최대 16 개의 작업을 수행 한 CPU에서 한 번에 비트는 두 가지 형식의 힘을 고수 할 의무가 없었습니다.

그래서 나는 젊었을 때의 오래된 Commodore 기계가 40 비트 부동 소수점을 사용했다는 사실에 특별히 놀라지 않았습니다. 애플 II와 같이 마이크로 소프트로부터 베이직 라이선스를 획득 한 다른 기계들도 마찬가지 였다는 사실을 알고도 놀라지 않을 것입니다. 왜 40 비트인가? 글쎄요, 모든 사람들이 계속해서 일을 알아 내고있었습니다. 내가 아는 한, 아마도 Bill Gates는 손가락을 공중에 꽂고 무작위로 숫자를 선택했을 것입니다. 하드 데이터가 부족하고 MITS에 이미 판매 할 기본 통역사가 있다고 말했을 때 서둘러 일을 처리해야한다는 점을 감안할 때 불합리하지 않을 것입니다.

그러나 BBC Micro와 ZX Spectrum Basic 인터프리터는 각각 독립적으로 작성되었습니다. 그리고 빠른 Google 검색을 통해 둘 다 40 비트 부동 소수점을 사용했음을 확인합니다.

어? 왜? 2의 거듭 제곱도 아니고, 좋은 반올림 숫자도 아니고, 내가 아는 특정 요구 사항이나 표준과 일치하지 않으며, 합리적으로 가능한 가장 크지도 작지도 않은 값도 아닙니다. 무슨 일이야? Microsoft는 무작위로 번호를 선택했고 다른 사람들은 모두 복사 했습니까? 아니면 내가 놓친 다른 것이 있습니까?

답변

38 Davislor Nov 13 2020 at 19:52

Microsoft BASIC의 부동 소수점 루틴은 원래 Intel 8080 CPU를 사용하는 Altair 용으로 1975 년 Monte Davidoff가 작성했습니다. 소스 코드는 빌 게이츠의 전 교사가 2000 년에 20 년 전에 그의 파일 캐비넷 뒤에서 떨어진 사본을 발견 할 때까지 수년 동안 손실되었습니다 .

Davidoff는 자신의 부동 소수점 형식을 발명해야했고, 8 개의 지수 비트 (bias-128), 1 개의 부호 비트 및 23 개의 정규화 된 가수 비트를 고안했습니다. 이것은 DEC VAX 단 정밀도 부동 소수점 숫자와 유사하지만보다 논리적 순서로 배치되었습니다.

1976 년 Gates, Allen 및 Davidoff는 BASIC의 6502 버전을 작성했습니다. 8K에 맞출 수 없었을 때 그들은 더 큰 ROM 칩에 넣고 "확장 된"40 비트 부동 소수점 형식을 포함하여 더 많은 기능을 추가하기로 결정했습니다. 그들은 8 비트 CPU에서 8 비트 지수를 유지하고 가수의 정밀도를 확장하기로 결정했습니다. Wozniak은 이미 Integer BASIC을 작성했으며 당시 부동 소수점 BASIC을 작업 중이었지만 동시에 다른 프로젝트에서도 작업하고있었습니다. 스티브 잡스는 너무 오래 걸린다고 느꼈고 대신 마이크로 소프트를 샀다. 에서 워즈의 기억 :

내 디자인 스타일은 머릿속의 모든 각도와 대략적인 스케치를 생각하고 코딩을 시작하는 데 상당한 시간을 소비하는 것입니다. 첫 번째 결과는 즉시 표시되지 않지만 결국 매우 빠르게 나타납니다. 스티브 잡스는 내가 충분한 진전을 이루지 못하고 있다고 걱정했습니다. 그는 심지어 한 직원 회의에서 오전 10시에 저를 괴롭 히고 들어 왔다고 비난했습니다. 그러나 나는 플로피 PC 카드를 펴고 [...] 매일 아침 4시에 떠날 것이라고 지적했습니다. 휴스턴 형제 인 딕과 클리프도 떠난 지 오래되었습니다.

Microsoft의 CP / M 용 MBASIC 및 MS-DOS 용 GWBASIC은 원래 Altair 용 8080 BASIC을 기반으로했으며 처음에는 32 비트 형식을 사용했지만 여러 부동 소수점 형식 (Xenix 버전의 압축 된 BCD 포함)을 거쳤습니다. GWBASIC에서 IEEE 형식으로 전환하기 전에 4.

Sophie Wilson이 6502 용 BBC Micro BASIC 원본을 썼고 Richard T. Russell 이 1986 년에 Z80 으로 포팅 한 후 나중에 다른 여러 기계에 포팅 했을 때 (Wilson을 BBC Micro BASIC의 "천재"로 인정) Microsoft의 확장 부동 소수점 숫자와 동일한 범위를 "실수"합니다. (Wilson의 이전 BASIC 인 Acorn Atom은 부동 소수점을 지원하지 않았습니다.) Russell의 말에 따르면,“현재 우리가 BBC BASIC으로 알고있는 것은 Acorn이 이미 제작할 계획 인 것과 '표준'언어에 대한 BBC의 욕구 사이의 타협의 결과로 발생했습니다. Microsoft BASIC 용으로 작성된 프로그램은 BBC BASIC에서 실행하는 데 거의 또는 전혀 변경이 필요하지 않지만 BBC BASIC 용으로 특별히 작성된 프로그램은보다 정교한 기능을 활용할 수 있습니다.” ARM 용 BASIC VI는 32 비트 RISC 시스템에서 정렬되지 않은 메모리 액세스가 필요했던 이전 숫자 형식을 32 비트 정수와 64 비트 실수로 대체했습니다.

Spectrum BASIC은 BBC BASIC과 동시에 작성된 Steven Vickers의 ZX81 BASIC의 확장입니다. Vickers는 나중에 "[ZX] 81에 대한 유일한 확실한 요약은 [ZX] 80의 수학 패키지를 개선해야한다는 것"이라고 말했습니다. 따라서 Sinclair는 경쟁 업체의 부동 소수점 정밀도와 일치 할 수 있기를 원했을 것입니다. , Microsoft BASIC이있는 TRS-80. 1988 년 Sinclair의 노트북을 포함한 다른 여러 영국 컴퓨터는 BBC Basic에서 파생 된 Russell의 BASIC을 사용했습니다.

21 user Nov 13 2020 at 20:55

32 비트 부호있는 가수와 8 비트 부호없는 지수를 사용하면 한 가지 큰 이점이 있습니다. 가수 연산을 위해 32 비트 정수 수학 함수를 재사용 할 수 있습니다.

재사용하면 메모리가 절약됩니다. 문자는 일반적으로 8 비트 부호없는 ASCII로 저장되므로 문자 수학이 지원되는 경우 8 비트 지수 수학을 최적화 할 수도 있습니다.

원래 Microsoft BASIC은 8k로 의도되었지만 공간 부족으로 인해 결국 16k로 확장되었습니다. 그 결정을 내리기 전에는 가능한 한 많은 공간을 절약하는 것이 합리적이었을 것이므로 8/32 비트 부동 소수점 형식이 어떻게 선택되었는지 상상하기 쉽습니다.

16 RadovanGarabík Nov 13 2020 at 19:43

2의 거듭 제곱도 아니고, 좋은 반올림 숫자도 아닙니다.

그러나 그것은 :-) 1 바이트 지수 (1 비트가 항상 1과 같다고 가정), 4 바이트 가수, 적어도 ZX 스펙트럼에서 – ZX 스펙트럼 매뉴얼 참조 . 그리고 가수와 지수가 개별적으로 처리되기 때문에 가수는 2의 좋은 거듭 제곱입니다. 물론 이것은 전체 32 비트 레지스터 없이는 이점이 적지 만 여전히 그렇습니다.

7 TimLocke Nov 13 2020 at 22:02

32 비트 부동 소수점에는 23 비트의 가수가 있습니다 (지수에 8 개, 부호에 1 개 사용). 이것은 6 개의 유효 십진 자릿수만을 제공하며, 최대 9까지 가능하지만 정밀도는 보장되지 않습니다. 부동 소수점 수학을 지원한다고 주장하는 것은 충분한 정밀도이지만 일부 과학적 요구에는 그다지 정밀도가 아닙니다.

나는 그들이 더 중요한 십진수 정밀도를 제공하기를 원했지만 64 비트, 특히 8 비트 시스템에서 과잉이라고 느꼈다. 40 비트는 너무 많은 공간을 차지하지 않고 9 개의 유효 십진수 정밀도를 제공합니다.

Wikipedia 에 따르면 MS BASIC을 6502로 이식 할 때 8K 이상의 공간이 필요했습니다. 이제 12K의 공간이 있으므로 40 비트 FP로 확장 할 여지가있었습니다.

많은 이전 버전의 Microsoft BASIC에는 32 비트 FP 만 있으며 IBM PC ROM BASIC에도 32 비트 FP가 있지만 이후 MS BASIC에는 일반적으로 40 비트 FP가 있습니다. Tandy 100/102 및 MSX BASIC의 MS BASIC에는 64 비트 FP가 있습니다. C64 용 Kyan Pascal에는 64 비트 FP가 있습니다.

Atari BASIC에는 48 비트 FP가 있지만 BCD로 저장되어 정밀도 손실이 발생합니다. Atari 용 Microsoft BASIC에는 32 비트 및 64 비트 FP가 모두있어 프로그래머가 필요에 따라 속도와 정밀도 중에서 선택할 수 있습니다.

C64, IBM PC 및 Apple II 용 PROMAL 프로그래밍 언어에는 48 비트 FP가 있습니다.

거의 모든 8 비트 LOGO 구현에는 32 비트 FP가 있지만 Atari 버전은 OS ROM에서 48 비트 BCD FP 루틴을 사용합니다.

DEC의 FOCAL-71에는 48 비트 FP가 있지만 12 비트 시스템이므로 가수는 36 비트, 지수는 12 비트로 나뉩니다.

6 Roger Nov 14 2020 at 19:18

나는 1970 년경에 수치 작업을 위해 IBM 360을 많이 사용했고, 단 정밀도 (32 비트) 부동 소수점을 거의 발견했지만 놀랍도록 광범위한 문제에 적합하지는 않았습니다. 반면 "배정 밀도"(64 비트)는 과도하고 느 렸습니다. 40 비트 부동 소수점 (32 비트 가수)은 아마도 훌륭한 절충안 일 것입니다. 그러나 물론 그것은 당신이하는 일에 따라 다릅니다.

6 gnasher729 Nov 16 2020 at 06:42

이것은 모두 8 비트 컴퓨터에서 일어났습니다. 따라서 부동 소수점 형식의 설계자는 부동 소수점 숫자에 대해 3, 4, 5, 6, 7, 8 또는 9 바이트를 자유롭게 사용할 수 있었으며 4 바이트 또는 8 바이트를 사용하는 특별한 이점이 없었습니다.

명백한 차이점은 정밀도, 저장소 요구 사항, 코드 양 및 작업 실행 시간입니다. 32 비트 플로트는 현재로서는 정확하지 않은 경우 64 비트로 전환 할 수 있기 때문에 괜찮습니다. 그러나 그 시점에서 두 가지 형식을 갖는 것은 너무 복잡했을 것입니다. 그리고 모든 것에 4 바이트는 충분하지 않습니다. 모든 것에 대해 5 바이트는 허용 가능한 최소값에 불과한 경계선입니다.

BASIC은 8-16KB에 맞아야했기 때문에 코드 크기가 문제였습니다. n 번까지 코드를 n 번 복제하여 n 개의 작업을 수행 할 수 있지만 그 이상으로 크기를 작게 유지하려면 루프가 필요하므로 실행 시간이 실제로 늘어납니다. 그래서 나는 그것이 최소 허용 정밀도로 가고 6, 7 또는 그 이상의 바이트를 사용하지 않는 이유라고 생각합니다.

2 Kubahasn'tforgottenMonica Nov 28 2020 at 02:49

대부분의 정수 CPU에서 부동 소수점 연산은 실제로 압축되지 않은 표현에서 수행됩니다. 여기서 지수는 독립형 값이고 가수는 다른 값이며 부호는 별도의 부울 플래그 (때로는 지수 또는 가수에서 도난 된 비트)입니다. 따라서 패킹 된 IEEE 표현을 사용하는 것은 작업하기 전에 값의 패킹을 계속 풀고 완료되면 다시 패킹해야하기 때문에 비생산적입니다. 부동 소수점 BASIC은 또한 정수 데이터 유형을 가졌고, 정수가 32 비트 너비 인 경우,이를 처리하는 데 사용 된 서브 루틴은 가수 연산에 완벽했습니다. 시프트와 4 개의 산술 연산자 (add, sub, mul)가 필요했습니다. , div-대부분의 32 비트 정수 BASIC에서 이미 모두 사용할 수 있습니다. 40 비트 형식은 다음과 같이 매우 편리합니다.부동 소수점을 작동시키는 유일한 추가 코드는 가수 연산을 조정하고 지수에 대해 간단한 8 비트 수학을 수행하는 "래퍼"논리입니다.