Domanda

Non faccio uso di Tcl nel mio lavoro quotidiano. Tuttavia, ho un collega che interagisce in tanto con un cliente che desidera linguaggio di estensione del nostro strumento lavorato più come Tcl (!). Un tema ha portato su era come Tcl fargli impostare la quantità di precisione è stato memorizzato in una doppia, tramite una variabile globale, tcl_precision.

Ho fatto alcune ricerche web, e la documentazione che ho trovato certamente sembra suggerire che questo è il caso (e non solo l'impostazione della precisione di stampa). Tuttavia, sembra come se tcl_precision ha avuto una storia a scacchi. Ho l'impressione che sia stato rimosso completamente per una versione o due, e poi mettere di nuovo, ma con avvertenze e tut-tuts circa sovrascrivendo il valore di default, 0, il che significa che in realtà 17 (che le promesse manuale è sufficiente per rappresentare qualsiasi IEEE 754 doppio).

Quindi, qualcuno può dirmi di più su ciò tcl_precision effettivamente promette di fare, e quali effetti ha sul doppio under-the-cover? E 'solo una regolazione globale per stampa numeri, o lo fa in realtà troncare la precisione dei numeri come memorizzato (che sembra pericoloso per me)?

È stato utile?

Soluzione

Le altre risposte sono corrette che i controlli tcl_precision galleggiante -> conversione di stringhe.

tuttavia il vero problema (e la ragione non si dovrebbe scherzare con tcl_precision) è che di TCL VIA filosofia rende possibile che questa conversione non è solo fatto a schermo per esempio, si potrebbe costruire un espressione in una stringa e poi expr o costruire uno script in una stringa a eval. tcl_precicion lasciando solo significa che la conversione a stringa è reversibile, che è ovviamente importante in questi casi.

Dopo aver detto che se il cliente si basa sulla modifica tcl_presicion cambiare calcolo che probabilmente non sanno quello che stanno facendo. Si consiglia di vedere se è possibile scoprire ulteriori dettagli su ciò che realmente vogliono fare.

Altri suggerimenti

Non credo che il vostro cliente è corretto nella sua comprensione.

Credo che la variabile tcl_precision consente di impostare il numero di cifre significative Tcl verrà visualizzato quando si converte un vero e proprio in una stringa, come lei suggerisce.

L'impostazione predefinita è sei:

expr 1.11111111 + 1.11111111
=> 2.22222

Se si imposta a 10 si otterrebbe:

set tcl_precision 10
expr 1.11111111 + 1.11111111
=> 2.22222222

Non influenza il metodo effettivo Tcl usa per rappresentare il numero reale internamente, che viene documentato come tipo C doppia, fornendo circa 15 cifre decimali di precisione.

In Tcl 8.5, la variabile globale tcl_precision dovrebbe (probabilmente) essere lasciato bene da solo, come impostazione predefinita utilizza il numero minimo di cifre per rappresentare l'IEEE raddoppiare esattamente. Questo non è lo stesso che utilizzare un numero fisso di cifre, ma fa invece quello che la gente di solito vogliono. Se vogliono qualcosa di diverso, il caso è che stiamo parlando di formattazione del valore per l'uscita; in quel momento che si desidera utilizzare:

format %6f $doubleValue

o qualcosa di simile per produrre un valore nel formato attuale che vogliono vedere.

Il tcl_precision è un po 'divertente come sembra fuorviante.

Essa colpisce principalmente come stampa la variabile ma non come calcola internamente.

Internamente TCL utilizza il tipo doppio C così i calcoli sono effettuati utilizzando la stessa C tipi doppie regardeless del valore tcl_precision.

Quindi, se si fa

set x 1.123456

set tcl_preceision 2

Si visualizzerà 1.12 ma internamente è ancora il valore doppio completo è stato originariamente impostato.

Se si cambia la tcl_precision torna a dire "10"

Si tornerà a 1,123,456 mila

Quindi, il vostro non è in realtà il controllo della precisione di calcolo proprio come viene visualizzato.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top