2010-09-03 5 views
2

Qu'est-ce qu'une manière indépendante de la plate-forme de spécifier le plus grand nombre représentable négatif nombre à virgule flottante?Le plus grand nombre à virgule flottante négative représentable

Nous avons trouvé un algorithme qui a éclaté lorsqu'il est exécuté sur un SPU de la PS3, mais a bien fonctionné lors de la compilation pour le PPU:

float x = -FLT_MAX; 
/* stuff */ 
if (x > 0.0f) { 
    // If x is unchanged, code is executed on SPU 
} 

Essentiellement, est-il un équivalent négatif bien défini de FLT_MAX?

+0

Vous n'avez pas FLT_MIN? – stacker

+0

Pourquoi ne pas utiliser l'infini négatif? –

+0

À moins que le SPU et le PPU aient des précisions flottantes différentes, cela devrait fonctionner. Je suppose qu'il y a un problème dans la section/* stuff */commentée de votre code. –

Répondre

4

Sans savoir ce qu'il y a dans/* stuff * /, je ne pense pas que votre problème puisse être entièrement traité ici.

Il y a un bon ensemble de diapositives sur les problèmes inhérents au calcul à virgule flottante ici: http://realtimecollisiondetection.net/pubs/GDC07_Ericson_Physics_Tutorial_Numerical_Robustness.ppt - il y a peut-être un indice sur la source de votre problème.

La virgule flottante simple précision IEEE 754 n'est pas la même sur le SPU que sur le PPU. Vous trouverez une explication complète au chapitre 9 du document SPU ISA disponible auprès de http://cell.scei.co.jp/e_download.html. numéro de point.

+0

Je l'accepte comme la réponse - après avoir lu le document lié détaillant l'architecture de SPU, il est devenu évident que '-FLT_MAX' n'allait pas fonctionner. –

+0

En aparté, le code dans '/ * stuff * /' ne devrait pas importer, car 'x' n'a été touché que dans certaines conditions qui n'étaient pas respectées; 'x' était inchangé au moment où nous vérifions' x> 0.0f', ce qui explique pourquoi il y avait beaucoup de grattage quand il passait! –

+0

Oh, j'ai manqué le commentaire à l'intérieur du bloc if. Heureux d'entendre que vous avez travaillé :) – Jonathan

4

Vous voulez std::numeric_limits::lowest(), mais C++ 0x seulement, donc pas très multi-plateforme pour le moment.

Vous ne voulez certainement pas std::numeric_limits::min() - c'est la plus petite magnitude, pas la plus négative.

Si vous voulez quelque chose qui sera toujours inférieur à tous les autres doubles, utilisez -numeric_limits<double>::infinity().

+0

Upvoting, car nous voulons essentiellement un très grand nombre négatif qui est garanti être plus petit que toute autre chose. –

Questions connexes