2014-09-24 4 views
0

JavaScript로 하드웨어 에뮬레이터를 작성해야합니다. 자체 부동 소수점 형식을 가지고 있으므로 JS 숫자와 해당 형식 간의 변환을 많이합니다. 느립니다. 나는 바이트 형식의 부동 소수점 값을 원하는 형식에서 그리 멀지 않은 바이트를 직접 액세스 할 수 있기 때문에 JavaScript TypedArray float32를 사용할 생각이다. 그래서 변환은 훨씬 더 빨라질 것이다 (단 몇 개의 쉬프트 등, Uint8 사용). Float32보기).JavaScript의 이진 형식 TypedArray에 대해 float32

그러나 휴대용 솔루션이 어떻게 될지 잘 모르겠습니다. TypedArray 항목에 대한 다양한 문서에서 float32는 "해당 하드웨어의 네이티브 C 형식"등과 같습니다. 하지만 float32의 정확한 이진 형식이 일부 브라우저/JS를 실행하는 모든 플랫폼에서 동일 할 것으로 기대합니까? 나는 endiannes가 문제가 될 수 있다고 생각할 수 있지만 적어도 다른 차이점이 없다면 나는 그것을 처리 할 수 ​​있습니다. 내가 말할 수있는 한, 사용 된 형식은 IEE754 인 것처럼 보이지만 일부는 JS에서 float32를 구현하는 데 사용될 수 있습니다 (적어도 이국적이지는 않지만 ...) 플랫폼입니까?

적어도 x86 및 Apple A7 CPU를 테스트 할 수 있으며,이 CPU의 바이트 순서가 다른 것으로 생각 되면서도 매우 똑 같고 이상하지만 이상하다고 생각됩니다 (부동 형식이 아님). 가장 작은?). 그러나 그것은 단지 두 플랫폼/OS/브라우저/무엇이든지를 체크하는 글로벌 진실이 아닙니다 ...

답변

2

Float32Array은 호스트 시스템의 endianess에 대한 값베이스, 일반적으로 리틀 엔디안을 내부적으로 나타냅니다.

그렇습니다. 형식은 IEEE 754입니다 (FPU가 출시되기 전부터 사용되어 왔으며 그 변형은 너비가 더 커짐 (예 : 64 비트, 80 비트 등). JavaScript의 모든 숫자 (Number)는 내부적으로 64 비트 IEEE 754로 표현됩니다. 유형이 지정된 배열의 경우 32 비트 및 64 비트 IEEE 754를 사용할 수 있습니다.

PowerPC와 68k CPU는 빅 엔디안 (빅 엔디안을 사용해야합니다! :)). 소위 네트워크 주문도 빅 엔디안이기 때문에 플랫폼 독립적 인 많은 파일 형식이 빅 엔디안 바이트 순서로 (특히 오디오 및 그래픽과 함께) 저장됩니다. 대부분의 주류 컴퓨터는 x86과 같은 리틀 엔디안 CPU를 사용합니다. 따라서 이들을 조합 한 경우 서로 다른 바이트 순서를 처리해야 할 가능성이 큽니다.

endianess를 처리하려면 Float32Array 대신 DataView을 사용할 수 있습니다. 예를 들어

: 이제

var buffer = new ArrayBuffer(10240); // some raw byte buffer 
var view = new DataView(buffer);  // flexible view supporting endianness 

당신이 지금 읽고 마음에 엔디안으로 버퍼에 어떤 위치에 쓸 수는 (DataView를도 즉, 비 정렬 위치에 /에서 읽기/쓰기를 할 수 있습니다. Float32 값은 Float32/Uint32/Int16 등에서는 불가능합니다. 필요한 경우 위치 3에 값을 쓸 수 있습니다.

브라우저는 내부적으로 올바른 순서로 변환합니다 - 당신은 그냥있는 그대로 값을 제공 읽을 때 마찬가지로

view.setFloat32(pos, 0.5);    // big-endian 
view.setFloat32(pos, 0.5, false)  // big-endian 
view.setFloat32(pos, 0.5, true);  // little-endian 

그리고 :

var n = view.getFloat32(pos);   // big-endian 
var n = view.getFloat32(pos, false)  // big-endian 
var n = view.getFloat32(pos, true);  // little-endian 

팁 : 당신은 네이티브 Float32Array 사용할 수 있습니다 내부적으로 사용하고 나중에 엔디안을 사용하여 읽기/쓰기를 수행합니다.이것은 더 빠른 경향이 있지만 결과 버퍼의 엔디안 호스트 시스템과 다른 경우는 마지막에 DataView를를 사용하여 변환이 필요합니다

var view = new DataView(f32.buffer); 
var msbVal = view.getFloat32(0):  // returns 32-bit repres. in big-endian 
: 다음
var f32 = new Float32Array(buffer);  // or use a size 
f32[0] = 0.5; 

당신이 빅 엔디안 표현을 가지고 있는지 확인하기

일부 입력 사항을 준 희망! 내가 어떤 부분을 더 자세히 설명하기를 원한다면 나에게 질문을 던져 라.

관련 문제