2010-02-18 9 views
5

No uso Tcl en mi trabajo diario. Sin embargo, tengo un colega que de vez en cuando interactúa con un cliente que desea que el lenguaje de extensión de nuestra herramienta funcione más como Tcl (!). Un tema que planteó fue cómo Tcl le permitió establecer cuánta precisión se almacenó en un doble, a través de una variable global, tcl_precision.¿Cuál es el estado de tcl_precision?

Realicé algunas búsquedas web, y la documentación que encontré ciertamente parece sugerir que este es el caso (en lugar de simplemente establecer la precisión de impresión). Sin embargo, parece que tcl_precision ha tenido una historia accidentada. Me da la impresión de que fue eliminado por completo para una o dos versiones, y luego volví a ponerlo, pero con advertencias y tuttuts sobre anular el valor predeterminado, 0, lo que realmente significa 17 (que el manual promete es suficiente para representar cualquier IEEE 754 doble).

Entonces, ¿alguien puede decirme más acerca de lo que tcl_precision en realidad se compromete a hacer, y qué efecto tiene en los dobles bajo las cubiertas? ¿Es solo una configuración global para imprimir números, o de hecho truncar la precisión de los números almacenados (lo cual me parece peligroso)?

Respuesta

2

Las otras respuestas son correctas de que tcl_precision controla la conversión de cadena flotante ->.

Sin embargo, el problema real (y la razón por la que no debe meterse con tcl_precision) es que la filosofía EIAS de TCL hace posible que esta conversión no se realice solo en la pantalla, es decir, que pueda construir una expresión en una cadena y luego expr o construir un script en una cadena para evaluar. dejar tcl_precicion solo significa que la conversión a cadena es reversible, lo que obviamente es importante en estos casos.

Habiendo dicho que si su cliente confía en cambiar tcl_presicion para cambiar el cálculo, probablemente no sepa realmente lo que está haciendo. Es posible que desee ver si puede encontrar más detalles de lo que realmente quieren hacer.

4

No creo que su cliente sea correcto en su comprensión.

Creo que la variable tcl_precision le permite establecer el número de dígitos significativos que Tcl mostrará cuando convierta un real en una cadena, como sugiere.

La configuración por defecto es de seis:

expr 1.11111111 + 1.11111111 
=> 2.22222 

Si lo establece en 10 que se obtendría:

set tcl_precision 10 
expr 1.11111111 + 1.11111111 
=> 2.22222222 

que no afecta el método real Tcl utiliza para representar el número real internamente , que está documentado como un doble tipo C, proporcionando aproximadamente 15 dígitos decimales de precisión.

1

El tcl_precision es un poco divertido, ya que puede ser engañoso.

Afecta principalmente a cómo se imprime la variable pero no a cómo la calcula internamente.

Internamente, tcl utiliza el tipo doble C, por lo que los cálculos se realizan utilizando los mismos tipos dobles C independientemente del valor tcl_precision.

Así que si lo hace

set x 1.123456 

set tcl_preceision 2 

se mostrará 1.12 pero internamente sigue siendo el doble valor total que se creó originalmente.

Si cambia el tcl_precision volver a decir "10"

Se volverá a 1,123456

Por lo que su realidad no controlar la precisión de cálculo lo que se muestra.

3

En Tcl 8.5, la variable global tcl_precision debería (probablemente) dejarse sola, ya que la configuración predeterminada usa el mínimo número de dígitos para representar exactamente el doble IEEE correspondiente. Eso no es lo mismo que usar una cantidad fija de dígitos, sino que hace lo que la gente generalmente quiere. Si quieren algo más, existe la posibilidad de que estén hablando de formatear el valor del producto; que es cuando se desea utilizar:

format %6f $doubleValue

o algo por el estilo para producir un valor en el formato actual que quieren ver.

Cuestiones relacionadas