나는 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 일 것입니다. 그러나 역시 잘못된 것입니다.
어떻게 소수 부분에서 각 자릿수를 분리합니까?
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 –
궁금한 점을 염두에두고 8087 ROM의 pi 값이 약간 잘못되었습니다. – fuz
@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 비트 값이 아니라고 말한 것입니까? –