2010-02-18 15 views
5

Je n'utilise pas Tcl dans mon travail quotidien. Cependant, j'ai un collègue qui interagit occasionnellement avec un client qui souhaite que le langage d'extension de notre outil fonctionne plus comme Tcl (!). Un sujet qu'il a soulevé était comment Tcl lui a laissé définir combien de précision a été stocké dans un double, via une variable globale, tcl_precision. J'ai fait quelques recherches sur le Web, et la documentation que j'ai trouvée semble suggérer que c'est le cas (plutôt que de simplement définir la précision d'impression). Cependant, il semble que tcl_precision ait eu une histoire vérifiée. J'ai l'impression qu'il a été entièrement supprimé pour une version ou deux, puis remis, mais avec des avertissements et des tut-tuts à propos de surcharger la valeur par défaut, 0, ce qui signifie vraiment 17 (que le manuel promet est suffisant pour représenter tout IEEE 754 double).Quel est le statut de tcl_precision?

Donc, quelqu'un peut-il m'en dire plus sur ce que tcl_precision effectivement promet de faire, et quel effet cela a-t-il sur les sous-couvertures doubles? Est-ce juste un paramètre global pour l'impression nombres, ou est-ce en fait tronquer la précision des nombres comme stockés (qui me semble dangereux)?

Répondre

2

Les autres réponses sont correctes: tcl_precision contrôle la conversion float -> string.Cependant, le vrai problème (et la raison pour laquelle vous ne devriez pas jouer avec tcl_precision) est que la philosophie EIAS de TCL permet que cette conversion ne se fasse pas seulement à l'affichage, c'est-à-dire que vous pourriez construire une expression dans une chaîne. ou construire un script dans une chaîne à évaluer. laisser tcl_precicion seul signifie que la conversion en chaîne est réversible, ce qui est évidemment important dans ces cas. Cela dit, si votre client compte changer tcl_presicion pour changer de calcul, il ne sait probablement pas ce qu'il fait. Vous voudrez peut-être voir si vous pouvez trouver plus de détails sur ce qu'ils veulent vraiment faire.

4

Je ne pense pas que votre client soit correct dans sa compréhension.

Je crois que la variable tcl_precision vous permet de définir le nombre de chiffres significatifs que Tcl affichera quand il convertira un réel en une chaîne, comme vous le suggérez.

Le réglage par défaut est de six:

expr 1.11111111 + 1.11111111 
=> 2.22222 

Si vous définissez à 10 vous obtiendrez:

set tcl_precision 10 
expr 1.11111111 + 1.11111111 
=> 2.22222222 

Il n'affecte pas la méthode réelle Tcl utilise pour représenter le nombre réel interne , qui est documenté comme étant un double de type C, fournissant environ 15 chiffres décimaux de précision.

1

La tcl_precision est un peu drôle car elle semble trompeuse.

Cela affecte principalement la façon dont il imprime la variable mais pas comment il la calcule en interne.

En interne tcl utilise le type double C, donc les calculs sont effectués en utilisant les mêmes types doubles C sans tenir compte de la valeur tcl_precision.

Donc, si vous faites

set x 1.123456 

set tcl_preceision 2 

Il affiche 1,12, mais en interne, il est toujours la double valeur complète, il a été fixé.

Si vous changez le tcl_precision retour-à-dire « 10 »

Il va revenir à 1,123456

Ainsi, votre ne contrôle pas réellement la précision de calcul à quel point il est affiché.

3

Dans Tcl 8.5, la variable globale tcl_precision devrait (probablement) être laissée bien seule, car le paramètre par défaut utilise le nombre minimum de chiffres pour représenter exactement le double IEEE approprié. Ce n'est pas la même chose que d'utiliser un nombre fixe de chiffres, mais plutôt ce que les gens veulent habituellement. S'ils veulent quelque chose d'autre, le hasard est qu'ils parlent de la mise en forme de la valeur pour la production; c'est lorsque vous souhaitez utiliser:

format %6f $doubleValue

ou quelque chose comme ça pour produire une valeur réelle dans le format qu'ils veulent voir.