2017-09-04 5 views
2

Je suis probablement manquer quelque chose d'évident, mais j'expérimente avec gpu.js et obtenir des résultats étranges. Je veux juste m'assurer que je ne fais pas quelque chose de manifestement stupide (ce qui est probable).gpus.js (webgl?) Float32 question

Je ne sais pas si c'est un problème avec ce que je fais, ou la façon dont les calculs sont effectués quand ils sont effectués via gpu.js en utilisant WebGL.

créer un nouveau GPU et nouveau noyau:

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(); 

Cela me donne un résultat de 4.294.967.296 (contenu dans un float32array).

Si i exécuter le même calcul à partir de la console i obtenir un résultat de 4294967295.

Répondre

4

Une valeur à virgule flottante simple précision IEEE 754 (32 bits) est constitué de 24 bits significatifs et 8 bits d'exposant.

4294967295 est 0xffffffff (intégrale) qui ne peut pas être stocké dans un flottant de 32 bits avec la pleine précision, car il n'a que 24 bits significatifs.
4294967296 est 0x100000000 (intégrale) qui peut être stocké dans un flottant 32 bits, car il est 0x4f800000 (virgule flottante).

En comparaison, une valeur à virgule flottante double précision (64 bits) de IEEE 754 se compose de 53 bits significatifs et de 11 bits exposants.
Par conséquent, une valeur de virgule flottante de 64 bits peut stocker exactement la valeur 4294967295 (0x41efffffffe00000).