Pergunta

Não uso o TCL no meu trabalho diário. No entanto, tenho um colega que ocasionalmente interage com um cliente que deseja que a linguagem de extensão de nossa ferramenta funcione mais como o TCL (!). Um tópico que ele trouxe foi como o TCL o deixou definir quanta precisão era armazenado Em uma dupla, através de uma variável global, tcl_precision.

Fiz algumas pesquisas na Web, e a documentação que encontrei certamente parece sugerir que esse é o caso (em vez de apenas definir a precisão da impressão). No entanto, parece que o TCL_Precision teve um histórico de quadros. Tenho a impressão de que foi removida inteiramente para uma ou duas versão e depois recolocava, mas com avisos e tutes sobre a substituição do valor padrão, 0, que realmente significa 17 (que as promessas manuais são suficientes para representar qualquer IEEE 754 duplo).

Então, alguém pode me contar mais sobre o que tcl_precision na realidade promete fazer, e que efeito isso tem nas duplas sob as coberturas? É apenas um cenário global para impressão números, ou de fato truncar A precisão dos números é armazenada (o que me parece perigoso)?

Foi útil?

Solução

As outras respostas estão corretas que o TCL_Precision controla o float -> conversão de string.

No entanto, o verdadeiro problema (e o motivo que você não deve mexer com tcl_precision) é que o TCL's Eias A filosfia possibilita que essa conversão não seja feita apenas no Display, ou seja, você pode criar uma expressão em uma string e, em seguida, expritê -la ou criar um script em uma string para avaliar. Somente deixar tcl_precicion significa que a conversão em string é reversível, o que é obviamente importante nesses casos.

Dito isto, se seu cliente está dependendo da alteração de Tcl_Presicion para mudar a computação, provavelmente não sabe o que está fazendo. Você pode querer ver se pode descobrir mais detalhes do que eles realmente querem fazer.

Outras dicas

Eu não acho que seu cliente esteja correto em seu entendimento.

Acredito que a variável tcl_precision permite definir o número de dígitos significativos que o TCL exibirá quando converter uma string real em uma string, como você sugere.

A configuração padrão é seis:

expr 1.11111111 + 1.11111111
=> 2.22222

Se você defini -lo como 10, obteria:

set tcl_precision 10
expr 1.11111111 + 1.11111111
=> 2.22222222

Ele não afeta o método real que o TCL usa para representar o número real internamente, que é documentado como um duplo do tipo C, fornecendo cerca de 15 dígitos decimais de precisão.

Em TCL 8.5, o tcl_precision A variável global deve (provavelmente) ser deixada em paz, pois a configuração padrão usa o número mínimo de dígitos para representar exatamente o dobro relevante do IEEE. Não é o mesmo que usar um número fixo de dígitos, mas faz o que as pessoas geralmente desejam. Se eles querem outra coisa, o acaso é que eles estão falando em formatar o valor da saída; É quando você deseja usar:

format %6f $doubleValue

Ou algo assim para produzir um valor no formato real que eles querem ver.

A tcl_precision é um pouco engraçada, pois parece enganosa.

Afeta principalmente como imprime a variável, mas não como a calcula internamente.

Internamente, o TCL usa o tipo duplo C, para que os cálculos sejam feitos usando os mesmos tipos duplos C considerados do valor tcl_precision.

Então, se você fizer

set x 1.123456

set tcl_preceision 2

Ele exibirá 1.12, mas internamente ainda é o valor duplo total que foi originalmente definido.

Se você alterar o tcl_precision de volta para dizer "10"

Voltará para 1.123456

Portanto, você não está realmente controlando a precisão do cálculo da maneira como é exibida.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top