2017-09-04 8 views
2

나는 분명히 뭔가 빠졌지 만, gpu.js으로 실험 중이며 이상한 결과를 얻고 있습니다. 나는 단지 바보 같은 짓을하고 있지 않다는 것을 확실히하고 싶다.gpus.js (webgl?) float32 문제

WebGL을 사용하여 gpu.js를 통해 계산을 수행 할 때 또는 내가하는 일에 문제가 있는지 확실하지 않습니다.

이 나에게 4294967296의 결과를 제공
const gpu = new GPU(); 
const test = gpu.createKernel(function() { 
    return 255 + 
     (255 * 256) + 
     (255 * 256 * 256) + 
     (255 * 256 * 256 * 256); 
}).setOutput([1]); 

const res = test(); 

는 (A float32array에 포함) :

나는 새로운 GPU와 새로운 커널을 만들 수 있습니다. I 콘솔에서와 동일한 계산을 실행하면

가 나는 IEEE 754 단 정밀도 (32 비트) 부동 소수점 값이 24 상위 비트, 8 개 지수 비트 구성 4294967295

답변

4

의 결과를 얻는다.

4294967295는 0xffffffff (정수)이며 32 비트 부동 소수점에는 24 개의 유효 비트 만 있기 때문에 완전 정확도로 저장할 수 없습니다.
4294967296은 0x4f800000 (부동 소수점)이기 때문에 32 비트 부동 소수점에 저장할 수있는 0x100000000 (정수)입니다.

비교에서 IEEE 754 배정도 (64 비트) 부동 소수점 값은 53 개의 유효 비트와 11 개의 지수 비트로 구성됩니다.
따라서 64 비트 부동 소수점 값은 정확히 4294967295 값을 저장할 수 있습니다 (0x41efffffffe00000).