2016-11-18 10 views
3

나는 8087에서 레지스터 스택의 맨 위로 파이를로드하는 간단한 프로그램을 작성한 다음 그 실제 메모리를 짧은 실제 메모리 변수로 리턴합니다.8087 코 프로세서가 반환 한 짧은 실수의 분수 부분은 어떻게 변환합니까?

FLDPI      ;load pi 
FSTP DWORD PTR shortReal ;store pi in memory, then pop stack 

shortReal에 저장된 값은 40 49 0F DB 16 진수입니다. 이것은 바이너리로 0100000001001001111111011011로 변환됩니다.

첫 번째 비트는 0이므로 양수입니다. 1 (3)로 변환

1 (내포 포인트) 10010010000111111011011

1 (내포 포인트)이 올바른 그래서, 1.

그래서, 실제 개수는 다음과 같다하도록 바이어스 된 지수 부는 변환 PI의 정수 부분이지만,이 시점 이후에 나의 이해는 무너집니다.

이제 다음 번호가 남아있다 : ​​

0010010000111111011011

001 올바른 될 것이라고 1로 변환 할 수 있습니다. 그러나 그 다음 숫자는 001이 될 것이며 다시 1이 될 것입니다. 이것은 틀린 것이거나 0010 일 수 있으며 2 일 것입니다. 그러나 역시 잘못된 것입니다.

어떻게 소수 부분에서 각 자릿수를 분리합니까?

+2

x87의 32 비트 부동 소수점 형식은 [IEEE-754] (https : //en.wikipedia.org/wiki/IEEE_floating_point) binary32 (일명 단 정밀도) 형식입니다. [Wikipedia article] (https://en.wikipedia.org/wiki/Single-precision_floating-point_format)에는 할일처럼 직접 해독하는 예제가 있으며, 유용한 온라인 변환기가 있습니다. https : // www.h-schmidt.net/FloatConverter/IEEE754.html –

+2

궁금한 점을 염두에두고 8087 ROM의 pi 값이 약간 잘못되었습니다. – fuz

+0

@FUZxxl : x87은 66 비트의 정밀도를 갖는 내부 파이가 있으며 이는 FSIN 등의 범위 축소에 사용됩니다. (이 정도의 사용은 정확하지 않습니다. [Bruce Dawson의 우수한 기사] (https://randomascii.wordpress.com/2014/10/09/intel-witherestimates-error-bounds-by-1-3-quintillion) /), 기사의 아주 우수한 시리즈의 일부). 그러나 64 비트 double 또는 32-bit float에 pi를 올바르게 반올림 한 값을 얻을만큼 정확하지 않아야합니까? 아니면 FLDPI에 다른 값을 사용합니까? 아니면 그냥 내부적으로로드되는 정확한 80 비트 값이 아니라고 말한 것입니까? –

답변

4

아니요 ... 계산 방법이 아닙니다. 소수점 오른쪽으로 이동하면됩니다. 정확도가 증가합니다.

계산 ... -1 -2 -3 같이 감소 시키도록 n 값을 고려 이 수식을 사용

지금 진수 값 = 0 * 2^-1 + 0 * 2^-2 + 1 * 2^-3 + 0 * 2^-4 + 0 * 2^-5 + 1 * 2^-6 끝까지

+0

그건 내가 예상 한 결과를 실제로 제공하지 못합니다. 분수 부분은 PI의 근사값이어야합니다 (예 : .1416). –

+0

완벽하게 작동합니다. 감사합니다. –

+0

환영합니다. 이것은 기본 수학입니다. –