Pregunta

No consumo Tcl en mi trabajo diario. Sin embargo, tengo un colega que de vez en cuando interactúa con un cliente que desea lenguaje de extensión de nuestra herramienta trabajado más como Tcl (!). Uno de los temas que planteó fue cómo Tcl lo dejó establecido cómo era mucha precisión almacenado en un doble, a través de una variable global, tcl_precision.

Hice algunas búsquedas en la web, así como la documentación que encontré ciertamente parece sugerir que este es el caso (en lugar de establecer la precisión de impresión). Sin embargo, parece como si tcl_precision ha tenido una historia accidentada. Me da la impresión de que se elimina por completo para una versión o dos, y luego se puso de nuevo, pero con advertencias y Tut-tuts sobre reemplazando el valor por defecto, 0, lo que significa realmente 17 (que las promesas manual es suficiente para representar cualquier IEEE 754 doble).

Entonces, ¿puede alguien decirme más acerca de lo tcl_precision realmente que promete hacer, y el efecto que tiene en los dobles menores de los cubre-? ¿Es sólo una configuración global para impresión números, o lo hace, de hecho, truncado la precisión de los números almacenados (que me parece peligroso)?

¿Fue útil?

Solución

Las otras respuestas son correctas que los controles tcl_precision flotan -> conversión de cadenas.

Sin embargo, el problema real (y la razón por la que no debería meterse con tcl_precision) es que de TCL EIAS filosofía hace posible que esta conversión no es sólo hacerse en pantalla es decir, es posible construir una expresión de una cadena y luego expr o construir una secuencia de comandos en una cadena a eval. dejando tcl_precicion solo significa que la conversión a cadena es reversible, lo que obviamente es importante en estos casos.

Una vez dicho esto, si su cliente se basa en el cambio de tcl_presicion para cambiar el cálculo es probable que no se sabe muy bien lo que están haciendo. Es posible que desee para ver si se puede conocer más detalles de lo que realmente quieren hacer.

Otros consejos

No creo que su cliente tiene razón en su comprensión.

Creo que la variable tcl_precision le permite establecer el número de dígitos significativos Tcl mostrará cuando se convierte un real a una cadena, como usted 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

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

En Tcl 8.5, la variable global debe tcl_precision (probablemente) ser dejado en paz, ya que la configuración por defecto utiliza el número mínimo de dígitos para representar el IEEE relevante exactamente el doble. Eso no es lo mismo que usar un número fijo de dígitos, pero en cambio hace lo que la gente por lo general quieren. Si quieren algo más, la oportunidad es que están hablando de formatear el valor para la salida; 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.

El tcl_precision es un poco divertido como suena engañoso.

Afecta principalmente a la forma en que se imprime la variable, pero no cómo se calcula internamente.

Internamente tcl utiliza el doble de tipo C por lo que los cálculos se realizan usando el mismo C dobles tipos regardeless 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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top