2010-07-15 9 views
3

s'il vous plaît ignorer ce poste, j'ai mal interprété l'algorithme, donc la question n'est pas pertinente. Cependant, je ne peux plus fermer le message. S'il vous plaît voter pour fermerconverger vers zéro par sous-flux

J'utilise certain algorithme de recettes numériques, qui converge vers zéro via underflow:

// all types are the same floating type 
sum = 0 
for (i in 0,N) 
    sum += abs(V[i]); 

ma question, comment se fait-il? comment la somme de petits nombres positifs à virgule flottante converge-t-elle en sous-flux/zéro?

Y a-t-il une condition où 0 + f = 0 , f > 0?

l'algorithme en question est Jacoby, http://www.mpi-hd.mpg.de/astrophysik/HEA/internal/Numerical_Recipes/f11-1.pdf, page 460. Il est tout à fait possible que je ne comprenne pas comment la convergence est atteinte, si c'est le cas, veuillez me corriger.

merci

+0

Peut-être qu'il serait bon de nous dire quels types, compilateur vous utilisez. – InsertNickHere

+0

@Insert cela n'a pas d'importance, tant que underflow est réglé sur zéro.Type est tout point flottant IEEE, 32 bits ou 64 bits – Anycorn

+0

Hm puis un gourou devrait aider ici, je ne serai pas capable de penser que c'est la même chose pour toutes les langues, etc – InsertNickHere

Répondre

2

Si V est un tableau de doubles et sum est un float (ou single), vous pouvez certainement avoir des valeurs qui sont> 0 mais lorsqu'il est ajouté à la somme produit des 0 si elles sont plus petites que la plus petite valeur non nulle dénormalisé représentable dans un float.

Comment savez-vous sum est effectivement zéro et pas seulement vraiment très proche? Tous les bits sont-ils mis à zéro?

EDIT: après avoir lu l'application réelle, la remarque de sousverse à zéro fait probablement référence à des rotations répétées autour de divers axes pour déterminer les valeurs propres et les vecteurs propres d'une matrice. Dans ce cas, l'algorithme ne fonctionne que si vous pouvez supposer que des multiplications répétées de très petits nombres vont se bloquer ou passer à zéro. Cependant, la somme réelle ne subira pas elle-même des pertes.

+0

En supposant que 'sum' contient déjà' FLT_MIN' et qu'une valeur arbitrairement petite y soit ajoutée, comment le résultat correctement arrondi peut-il devenir plus petit que sum? Je demande parce que «somme» sera toujours plus proche du résultat exact que «0». –

+0

@Roland, il ne dit pas à quelle somme est initialisée, mais je vais supposer que c'est 0. Et un double peut être plus petit que FLT_MIN. Et converge à zéro et étant 0 bitwise sont deux choses différentes. Mais oui, la somme devrait augmenter de façon monotone. – MSN

+0

ici http://www.mpi-hd.mpg.de/astrophysik/HEA/internal/Numerical_Recipes/f11-1.pdf, page 460. tous les types sont les mêmes – Anycorn

0

Je serais très surpris si cela était possible en utilisant IEEE 754 Arithmétique. Le fait est que IEEE 754 indique que les résultats intermédiaires sont infiniment précis, puis arrondis au type de données de destination. Si vous avez sum + V[i], cette valeur sera toujours supérieure ou égale à sum. L'arrondi au nombre représentable suivant produira sum ou un nombre supérieur à sum.

Bien sûr, il n'y a rien dans la question initiale qui empêche sum d'être négatif en premier lieu. Dans ce cas, la réponse serait triviale. Dans l'arithmétique IEEE 754, il n'existe pas de numéro f tel que 0 + f = 0 et en même temps f > 0.

+0

merci, j'ai ajouté plus d'informations à la question, y compris le code source – Anycorn

1

Quels sont les types que vous utilisez? Si f est un float et d1 et d2 sont des doubles, vous obtenez ceci.

double d1 = std::numeric_limits<double>::min(); 
double d2 = std::numeric_limits<double>::min(); 
float f = d1 + d2; 
if (f == 0.0) std::cout << "yes"; 
else std::cout << "no"; 

Ceci produit "oui".

+0

Man you SO members sont rapides. Comment les débutants comme moi ont-ils une réputation quand on ne peut battre personne? ;) – cape1232

+1

@ cape1232, nous avons tous commencé comme ça. Vous devriez voir à quelle vitesse Litb répond aux questions ésotériques C++. Ou Jon Skeet en général. – MSN

+0

@MSN Litb est très utile en effet. Il a répondu à beaucoup de questions pour moi, un grand merci à lui – Anycorn