5

私は日常業務で Tcl を使用しません。しかし、私たちのツールの拡張言語が Tcl (!) のように機能することを望んでいる顧客と時折やり取りする同僚がいます。彼が持ち出したトピックの 1 つは、Tclがグローバル変数 tcl_precision を介して doubleに格納される精度をどのように設定できるかということでした。

私はいくつかの Web 検索を行いましたが、見つけたドキュメントは確かにこれが事実であることを示唆しているようです (印刷精度を設定するだけではありません)。ただし、tcl_precision には波乱万丈の歴史があるようです。1つか2つのバージョンで完全に削除されてから元に戻されたという印象を受けますが、デフォルト値0をオーバーライドすることについて警告とツットゥッとあります。これは実際には17を意味します(マニュアルでは、IEEE 754 ダブル)。

では、tcl_precisionが実際に行うことを約束していること、および隠れた double にどのような影響があるかについて、誰か教えてもらえますか? 数値を出力するための単なるグローバル設定ですか、それとも実際に格納されている数値の精度を切り捨てますか (これは私には危険に思えます)?

4

4 に答える 4

4

あなたの顧客の理解は正しくないと思います。

あなたが示唆するように、tcl_precision変数を使用すると、実数を文字列に変換するときにTclが表示する有効桁数を設定できると思います。

デフォルト設定は 6 です。

expr 1.11111111 + 1.11111111
=> 2.22222

10 に設定すると、次のようになります。

set tcl_precision 10
expr 1.11111111 + 1.11111111
=> 2.22222222

これは、Tcl が内部的に実数を表すために使用する実際の方法には影響しません。これは、C 型の double として文書化されており、10 進数で約 15 桁の精度を提供します。

于 2010-02-18T04:49:33.797 に答える
3

Tcl 8.5 では、tcl_precisionグローバル変数は (おそらく) そのままにしておく必要があります。デフォルト設定では、関連する IEEE double を正確に表すために最小桁数が使用されるためです。これは、固定桁数を使用することと同じではありませんが、代わりに、人々が通常望んでいることを行います。他の何かが必要な場合は、出力用に値をフォーマットすることについて話している可能性があります。それはあなたが使いたいときです:

format %6f $doubleValue

または、彼らが見たい実際の形式で値を生成するようなもの。

于 2010-03-25T15:48:36.250 に答える
2

tcl_precision が float -> string 変換を制御するという他の答えは正しいです。

ただし、本当の問題 (および tcl_precision をいじってはいけない理由) は、TCL のEIAS哲学により、この変換が表示時にのみ行われない可能性があることです。つまり、文字列で式を作成してから expr するか、評価する文字列のスクリプト。tcl_precicion をそのままにしておくことは、文字列への変換が元に戻せることを意味します。これは、これらの場合に明らかに重要です。

あなたの顧客が計算を変更するために tcl_presicion の変更に依存している場合、彼らはおそらく自分が何をしているのか本当に分かっていないでしょう。彼らが実際にやりたいことの詳細を確認できるかどうかを確認したい場合があります。

于 2010-02-22T15:14:37.270 に答える
1

tcl_precision は、誤解を招くように聞こえるので、少しおかしいです。

これは主に、変数を出力する方法に影響しますが、内部で計算する方法には影響しません。

内部的に tcl は C の double 型を使用するため、tcl_precision 値に関係なく、同じ C の double 型を使用して計算が行われます。

だからあなたがするなら

set x 1.123456

set tcl_preceision 2

1.12 と表示されますが、内部的には最初に設定された完全な double 値のままです。

tcl_precision を "10" に戻すと、

1.123456に戻ります

したがって、表示方法だけで計算精度を実際に制御することはできません。

于 2010-02-20T23:08:58.547 に答える