2017-12-12 42 views
-1

NEON 인라인 어셈블리에서 Signed int32를 Float로 변환하면 숫자가 달라집니다. NEON int32를 float로 변환하면 잘못된 결과가 발생합니다.

enter image description here

여기 플로트 서명 INT32의 출력이 인쇄된다 : 그것은 무작위 상이 enter image description here

(단지 짝수 번호). sint32로 저장하고 float로 저장하는 것 사이의 변환 (다른 연산 없음) 만 있습니다.

어떻게 피 하시겠습니까? 감사합니다

답변

3

플로트는 따라서 -2^24 ~ 2^24-1 창 외부의 어떤 INT32가 변환하는 동안 정밀도를 잃게됩니다 별도의 부호 비트 (MSB)

와 가수에 할당 된 경우에만 23bits을 가지고 있습니다. (잘림 발생)

ARM/NEON에만 해당되는 것은 아닙니다. 단 정밀도 부동 소수점 수의

https://en.wikipedia.org/wiki/Single-precision_floating-point_format

+0

유효 기호 (선호 용어, 유효 기호는 선형이지만 가수는 역사적으로 로그입니다)는 24 비트입니다. 23 비트 만 명시 적으로 저장되지만 24 번째 비트는 유효 숫자와 지수를 결합하여 유추됩니다. 이것은 -2 \ * \ * 24에서 +2 \ * \ * 24까지의 표현 가능한 정수의 범위를 2 \ * \ * 23가 아닌 정수로 만듭니다. –

+0

@EricPostpischil 네가 맞아! 그에 따라 내 대답을 수정합니다. –

+0

그 범위를 벗어나는 일부 정수 *는 정확하게 나타낼 수 있습니다. 특히, 뒤에 오는 0이있는 정수. 즉 기본 2의 유효 숫자가 24 자리 또는 그 이하입니다. 따라서 범위 밖의 어떤 * int32도 정밀도를 잃지는 않습니다. 예 : 'int32_t '가 수용 할 수있는 범위 밖의 값을 포함하여 2의 지수 (FLT_MAX보다 낮음)를 정확히 나타낼 수 있습니다. 24 비트 범위 밖의 모든 'float'값은 정수입니다. –

1

significands (분획 부)는 단지 24 비트이다. (23 비트가 명시 적으로 저장되고 1은 지수와 significand에서 추론됩니다.) 2 이상의 값을 갖는 정수는 부동 소수점 형식에 맞게 반올림되어야합니다.

1

64 비트 int로 변환 한 다음 64 비트 float로 변환하기 위해 NEON 명령어를 사용하여 해결되었습니다.

+0

NEON은 압축 된 32 비트 int에서 압축 된 64 비트 double 정밀도 float로 직접 변환하지 않습니까? x86 SSE2 않습니다. –

+0

NEON은 배정 밀도를 전혀 지원하지 않습니다. 하지만 AArch64 Advanced SIMD가 사용하고 있으며, 그게 당신이 사용하고있는 것입니다 ('scvtf'). 그리고 그것은 현재 32 비트 int ->'double' 만 지원하며, ARM32 VFP와 같은 스칼라 만 지원하는 것처럼 보입니다. 그래서 네, 먼저 64 비트 int로 변환하는 것은 대개 'sshll' 명령 하나로 스칼라를 사용하는 것보다 좋은 방법 일 것입니다. (그리고 16 바이트 벡터의 상반부를위한'shll2'). –

+0

당신이 사용했던 것은 사실 VFP 명령이라고 생각합니다. –

관련 문제