완전성 (또는 쓸모없는 쇼)을 위해서, 여기에 곱셈없이 선형 검색 (0-15 값의 경우 대부분의 경우에 더 빠르다. 곱셈과 함께 이진 검색). 당신이 소수 부분을 필요로하지 않는다면
root = -1
square = 0
addValue = 1
while (square <= input) {
square += addValue
addValue += 2
++root
}
; here root == trunc(sqrt(input))
그래서,이 충분하거나 것입니다 당신이 이와 함께, 소수점 이하 부분에 대해 최소한 256B 긴 LUT를 사용하도록 허용 할 경우.
8 비트 정수 레지스터를 사용하여 적절한 소수점 sqrt를 작성하는 것은 실제로 상당히 효과적이므로 나는 모든 재미를 없앨 수 없습니다. : P ..
몇 가지 "base_exp"값을 곱하면 제한된 범위의 소수를 정수로 변환 할 수 있다는 것을 잊지 마십시오.
e.e. 0.00에서 15.99까지의 값은 * 100 (0-1599)을 수행하여 11 비트 정수로 변환 할 수 있고 (100 * 100)의 sqrt는 100이므로 10000 입력으로 0-2550000 값을 얻을 수 있습니다 (적어도 22 비트, 24b까지 반올림), 정수 제곱근을 사용하면 결과 * 100 (및 11 비트에 맞음)이되므로 100으로 나눠 두 값으로 나눌 수 있습니다.
인간에 대해서는 단순 해 보일 수 있지만 실제로 8/16b 레지스터를 사용하여 십진법 계산을 수행하는 경우이 원리로 수행되는 경우가 많았지 만 대신 2의 제곱 값, 즉 * 256 * 256이 사용되었는데 값 16 조금 남았습니다. 그리고 256으로 나눈 값은 8에서 오른쪽으로 값을 이동시킵니다.
따라서 이진수가있는이 숫자 방식의 경우 24 비트 덧셈/뺄셈/시프터 코드를 만들어야합니다. 입력 된 숫자는 24 비트의 최상위 8 비트입니다. (즉, 입력 값 10
=>(10<<16) == 0x0A0000
) => 간단한 이동. 그 값을 sqrt (0x0329 또는 0x032A, 그냥 잘라내거나 마지막 비트에서 반올림하는 경우에 따라 다름)을 계산하면 결과는 반드시 12 비트에 맞을 것이고 위쪽 4는 전체 파트 0-15이고, 하위 8 비트는 "1/256"의 값 (0x29/256 = 0.16015625)으로 십진수입니다. 이는 단순한 이동/회전, 즉 mul/div 조작이 필요하지 않음으로써 다시 분할 될 수 있습니다.
그래도 여전히 많은 작업이 될 것입니다.하지만 8 비트 CPU에서 24 비트 곱하기/나누기를 수행하는 것은 추가/하위/쉬프트 확장보다 훨씬 쉽습니다. 결과의 소수 부분에서 전체 8 비트의 정밀도를 사용하고 더 많은 이진 계산을 위해 더 단순하게 만드는 이유를 4 : 8 fixed-point 결과 형식으로 선택한 이유를 설명하십시오. (8시 8 분 고정 소수점 0.5 = 0x0080 ... 그걸 추가하려고하면 어떤 일이 일어나는가 봅니다 : 0x0080 + 0x0080 = 0x0100 = 1.0 어떤 결과도 복잡하지 않습니다. 그것이 8 비트 CPU에서 저 정밀도 십진수 계산을 한 방법입니다 , 예를 들어 sin/cos 효과의 경우에도 곱셈/나눗셈이 0 일 때 더 간단합니다.5 : 0x0080 * 0x0080 = (0x4000 >> 8) = 0x0040 = 0.25).
길이가 256 바이트 인 테이블을 검색하면 어떻습니까? (음, 소수점 부분이 512B보다 길기 때문에 ... 고정 소수점 수학 8시 8 분입니까?) 그리고 십진수는 256B 만 있으면 전체 루프를 한 루프 씩 천천히 정렬 할 수 있습니다.) – Ped7g
슬프게도 그것은 할당이고 그것을 계산해야합니다. 그렇지 않으면 실행 가능한 옵션이되지만 입력에 대한 감사드립니다. –
비록 내가 이것을 이해하지 못한다면 나는 이것을 최후의 수단으로 할 것이다. (삽입 된 숫자를 256 개의 결과와 비교하고 올바르게 찾으면 끝내는 프로그램을 만드는 것이 좋습니다) –