십진수 산술로 인해 VisiCalc가 느려지는 이유는 무엇입니까?

Nov 22 2020

이 비지 칼크에 대한 훌륭한 기사 일이 당신이 컴퓨팅 역사의 일부에 관심이 있다면, 왜 추천 무엇에 대한 모든 세부로 들어갑니다. 이 섹션을 읽고있었습니다.

VisiCalc의 핵심은 숫자에 관한 것입니다. 우리가 내린 초기 결정 중 하나는 십진 산술을 사용하여 회계사가 십진 계산기를 사용하여 볼 수있는 오류와 동일하도록하는 것이 었습니다. 돌이켜 보면 사람들이 신경 쓰지 않는 것으로 밝혀졌고 이진법보다 훨씬 느리게 계산을했기 때문에 이것은 잘못된 결정이었습니다.

그리고 고개를 끄덕이며 VisiCalc의 후임자들은 이와 관련하여 물러났습니다. 오늘날까지 인터넷은 Excel이 사람들이 기대하는 방식으로 반올림되지 않는 0.1 및 이진 부동 소수점과 같은 숫자로 이상 현상을 보이는 이유에 대한 질문과 답변으로 가득 차 있습니다. VisiCalc는 실제로 광고 캠페인을 시작 했어야했습니다.

... 잠시만 요. 냉장고 논리.

계산이 훨씬 느려졌습니까?

VisiCalc는 BCD 산술을 지원하는 6502에 작성되었습니다. 십진수 모드를 켜면 CPU가 바이너리 바이트를 추가하는 것과 정확히 같은 속도로 BCD 바이트를 추가합니다.

그러나 스프레드 시트에있는 대부분의 숫자는 십진수로 표현할 때 간단합니다. 1234.56과 같은 숫자는 BCD에서 3 바이트를 사용하며 배정 밀도 이진 부동 소수점에서 8 바이트를 사용합니다. 이는 메모리를 절약 할뿐만 아니라 (소프트웨어에서 수행해야하는-기계에 FPU가없는) 계산 루틴을 조기 종료 할 수있는 기회를 갖게되면 시간도 절약됩니다. 따라서 스프레드 시트에서 일반적으로 발생하는 숫자 계산은 십진수 로 더 빠릅니다 .

그리고 작은 스프레드 시트는 디스플레이를 업데이트하는 데 많은 시간을 소비합니다. 내부 표현이 10 진수이면 숫자를 내부 표현에서 ASCII로 변환하는 것이 훨씬 더 빠릅니다.

그렇다면 왜 소수가 계산을 더 느리게 만들었다 고 말했습니까?

답변

10 manassehkatz-Moving2Codidact Nov 23 2020 at 00:22

1234.56과 같은 숫자는 배정 밀도 이진 부동 소수점에서 8 바이트를 사용하는 BCD에서 3 바이트를 사용합니다.

일반적으로 말하면 그렇지 않습니다. 총 6 자리, 소수점 앞 4 자리, 뒤 2 자리, 양수 만 데이터베이스 필드 정의가있는 경우 3 개의 8 비트 BCD 바이트로 1234.56을 나타낼 수 있습니다. 그러나 더 일반적으로 다음과 같은 경우 :

  • 어떤 숫자 든 더 많은 자릿수를 가질 수 있습니다. 예를 들어, 페니에 지정된 최대 $ 1,000,000을 허용하기 위해 8 자리가 최소값입니다. 더 일반적인 것은 10 또는 12 이상입니다.
  • 다른 필드에서 소수점 이하 다양한 자릿수를 허용합니다. 예를 들어 미국 (및 기타 많은) 통화 값의 경우 2, 단가의 경우 6 이상 (예 : 공공 요금의 경우 kWh 비용)
  • 음수를 허용합니다.

그런 다음 매우 빠르게 3 바이트를 넘어갑니다. 8 바이트가 적절한 최소값이 됩니다.

저장 (계산 무시)의 경우에도 6 자리 숫자에는 3 바이트가 작동하지 않습니다. 어딘가 에서이 셀 에 마지막 2 자리 앞에 소수점이있는 3 바이트 양수 를 정의해야하기 때문 입니다. 1 바이트가 필요하므로 이제 4 바이트가됩니다.

또한 추가 조작 (다른 길이의 숫자 형식 코딩 / 디코딩)에 필요한 코드 는 일반적인 8 비트 시스템에서 사용할 수 있는 매우 제한된 64k 코드 + 데이터를 소모 합니다. 스프레드 시트에서 숫자 셀의 크기 (그리고 평균적으로 훨씬 더 작음)를 변경하여 값을 저장하는 공간이 일반적으로 해당 숫자의 표시, 조작 및 계산을 지원하는 메모리에 필요한 추가 코드보다 더 클 수 있습니다. .

8 WillHartung Nov 22 2020 at 22:49

6502는 SIMPLE BCD 산술을 지원합니다. 결국 VisiCalc 녀석들은 그 기능을 사용하지 않았고 모든 것을 처음부터 작성했습니다. 덧셈과 뺄셈뿐만 아니라 곱셈과 나눗셈도 있으며 VisiCalc는 부동 소수점 (10 진수 부동 소수점)이었습니다.

십진법이 더 느린 이유는 "아무도"오늘날 십진법을 사용하는 것과 같은 이유입니다. 그들은 이진법을 사용합니다. 이진 수학에서는 각 비트가 숫자입니다. 10 진수 수학에서는 4 비트가 숫자입니다. 정확도가 떨어지고 더 많은 메모리를 사용하면 수학이 느리고 컴퓨터에서 훨씬 더 많은 작업을 수행 할 수 있습니다. 심지어 초기 지원을 제공하는 6502도 마찬가지입니다.

(그리고 예, 십진법 수학은 여러 곳에서 사용되지만 규칙이 아닌 예외입니다.)

5 RETRAC Nov 23 2020 at 00:13

6502에서도 십진 연산이 더 느리기 때문입니다. 8 비트 BCD 더하기 및 빼기에 대한 프로세서 지원이 있지만 그게 전부입니다.

십진법 곱셈, 나눗셈, 시프트, 부동 소수점 정규화 및 심지어 비교를위한 코드는 바이너리보다 다소 크고 느릴 것입니다.

예를 들어, shift-and-subtract 나누기 루틴은 값을 반으로 줄이려면 서브 루틴이 필요합니다. 바이너리에서 이것은 사소합니다. 8 비트 값을 예로 사용 :

        LSR

십진수 모드에서는 다음과 같습니다 ( "소수 모드에서 곱하기 및 나누기"제공 ).

        ROR
N08     PHP
        BPL HALF2
        SEC
        SBC #$30
HALF2   BIT N08
        BEQ HALF3
        SEC
        SBC #3
HALF3   PLP

이와 같은 코드는 소수 나누기 루틴의 내부 루프에 있습니다. 속도 패널티는 상당합니다.