2010-01-18 3 views
11

Alors que, autant que je me souvienne, IEEE 754 ne dit rien sur un mode de chasse à zéro pour gérer denormalized numbers plus rapidement, certaines architectures offrent ce mode (par exemple http://docs.sun.com/source/806-3568/ncg_lib.html).comportement flush-to-zero en arithmétique en virgule flottante

Dans le cas particulier de cette documentation technique, le traitement standard des nombres dénormalisés est la valeur par défaut, et le rinçage à zéro doit être activé explicitement. En mode par défaut, les nombres dénormalisés sont également traités dans le logiciel, ce qui est plus lent.

Je travaille sur un analyseur statique pour C embarqué qui essaie de prédire des plages correctes (si parfois imprécises) pour les valeurs qui peuvent arriver à l'exécution. Il vise à être correct car il est destiné à être utilisable pour exclure la possibilité de quelque chose qui ne va pas au moment de l'exécution (par exemple pour le code embarqué critique). Cela nécessite d'avoir capturé tous les comportements possibles pendant l'analyse, et donc toutes les valeurs possibles produites lors des calculs en virgule flottante.

Dans ce contexte, ma question est double:

  1. parmi les architectures embarquées, y sont architectures qui offrent flush seulement à zéro? Ils n'auraient peut-être pas le droit de se faire connaître comme "IEEE 754", mais pourraient offrir des opérations à virgule flottante de type IEEE 754 assez proches.

  2. Pour les architectures qui offrent à la fois, dans un contexte intégré, n'est pas probablement affleurant à zéro à activer par le système, afin de rendre le temps de réaction plus prévisible (une contrainte commune pour ces systèmes embarqués)?

Manipulation de rinçage à zéro dans l'arithmétique des intervalles que j'utilise pour les valeurs à virgule flottante est assez simple si je sais que je dois le faire, ma question est plus de savoir si je dois le faire.

+0

Bonne question, bien indiquée. Je ne suis pas un expert en systèmes embarqués, mais je soupçonne qu'il n'y a pas de réponse claire. Cela dépend uniquement de votre environnement d'utilisateur final particulier. – GManNickG

Répondre

7

Oui aux deux questions. Il existe des plates-formes qui prennent en charge le flush-to-zero uniquement, et il existe de nombreuses plates-formes où flush-to-zero est la valeur par défaut.

Vous devez également être conscient que de nombreuses plates-formes embarquées et dsp utilisent un mode "Denormals Are Zero", qui est une autre ride dans la sémantique à virgule flottante.


Modifier autre explication de ZLE par rapport DAZ:

En FTZ, lorsqu'une opération produirait un résultat denormal sous la moyenne arithmétique habituelle, un zéro est retourné. Notez que certaines implémentations affleurent toujours le zéro positif, tandis que d'autres peuvent atteindre le zéro positif ou négatif. Il est probablement préférable de ne pas dépendre de l'un ou l'autre comportement.

Dans DAZ, lorsqu'une entrée d'une opération est un dénormal, un zéro est substitué à sa place. Encore une fois, il n'y a aucune garantie générale quant au zéro qui sera substitué. Certaines implémentations qui prennent en charge ces modes leur permettent d'être définies indépendamment (et certaines ne prennent en charge qu'une seule des deux), il peut donc être nécessaire de pouvoir modéliser indépendamment l'un ou l'autre de ces modes.

Notez également que certaines implémentations combinent ces deux modes en "Flush to Zero". Le mode ARM VFP "flush to zero" est à la fois FTZ et DAZ, par exemple.

+0

Aujourd'hui j'ai implémenté l'arithmétique d'intervalle qui englobe à la fois toutes les possibilités de FTZ, DAZ (rinçage à +0 ou même signe zéro) et IEEE 754 sous-normales. Aucun de nos tests de régression n'a montré de différence par rapport à l'arithmétique précédente, IEEE 754 seulement. Donc, il ne sera probablement pas nécessaire de déranger les utilisateurs avec une option pour cela, le nouveau mode devrait rendre tout le monde heureux. C'est une très bonne chose. Merci encore! –

+0

Génial, heureux d'aider. –

+0

Quelle serait la praticité de l'exécution de calculs en virgule flottante afin que tous les bits de la mantisse qui représentaient des valeurs plus petites que la plus petite valeur normalisée seraient arrondis? Je pense que cela pourrait être moins cher que de traiter des valeurs dénormalisées, puisque tous les nombres à virgule flottante auraient la même représentation. Seule l'étape du «nettoyage final» devrait changer. – supercat

2

ARM Les noyaux Cortex ont une option de niveau zéro, difficile de voir comment vous pouvez l'ignorer. Encore une fois, ne prenez pas de conseils d'affaires à partir d'un forum. Parlez à vos clients.

+0

Les utilisateurs existants sont excellents, ils utilisent des plates-formes saines, comprennent les problèmes à virgule flottante et vont jusqu'à désexciter la génération silencieuse de 'fmadd' par leur compilateur pour rendre les erreurs d'arrondi plus prévisibles. Ce sont les utilisateurs potentiels qui m'intéressent. Merci pour vos commentaires. –

Questions connexes