2010-02-18 48 views
5

Tôi không sử dụng Tcl trong công việc hàng ngày của mình. Tuy nhiên, tôi có một đồng nghiệp thỉnh thoảng tương tác với một khách hàng mong muốn ngôn ngữ mở rộng của công cụ chúng tôi hoạt động giống như Tcl (!). Một chủ đề mà anh ta đề cập là cách Tcl cho anh ta đặt độ chính xác là được lưu trữ trong một đôi, thông qua biến toàn cục, tcl_precision.Trạng thái của tcl_precision là gì?

Tôi đã thực hiện một số tìm kiếm trên web và tài liệu tôi thấy chắc chắn dường như gợi ý rằng đây là trường hợp (thay vì chỉ đặt độ chính xác in). Tuy nhiên, có vẻ như tcl_precision đã có lịch sử rô. Tôi có ấn tượng rằng nó đã bị xóa hoàn toàn cho một hoặc hai phiên bản, và sau đó đưa trở lại, nhưng với cảnh báo và tut-tuts về việc ghi đè giá trị mặc định, 0, điều đó thực sự có nghĩa là 17 (hướng dẫn sử dụng hứa hẹn là đủ để đại diện cho bất kỳ IEEE nào 754 đôi).

Vì vậy, bất kỳ ai cũng có thể cho tôi biết thêm về những gì tcl_precision thực sự là hứa hẹn sẽ làm gì và tác động của nó lên gấp đôi trong phạm vi phủ sóng? Có phải chỉ là cài đặt chung cho số in số hoặc thực tế là cắt ngắn độ chính xác của số được lưu trữ (điều này có vẻ nguy hiểm đối với tôi)?

Trả lời

2

Các câu trả lời khác là chính xác rằng điều khiển tcl_precision float -> string conversion.

tuy nhiên vấn đề thực sự (và lý do bạn không nên gây rối với tcl_precision) là EIAS philosphy TCL làm cho nó có thể là chuyển đổi này không chỉ được thực hiện tại hiển thị tức là bạn có thể xây dựng một biểu hiện trong một chuỗi và sau đó expr nó hoặc xây dựng một kịch bản trong một chuỗi để eval. để lại tcl_precicion một mình có nghĩa là chuyển đổi thành chuỗi có thể đảo ngược, điều này rõ ràng là quan trọng trong những trường hợp này.

Có nói rằng nếu khách hàng của bạn đang dựa vào việc thay đổi tcl_presicion để thay đổi tính toán, họ có thể không thực sự biết những gì họ đang làm. Bạn có thể muốn xem liệu bạn có thể tìm hiểu thêm chi tiết về những gì họ thực sự muốn làm hay không.

4

Tôi không nghĩ rằng khách hàng của bạn là chính xác trong sự hiểu biết của mình.

Tôi tin rằng biến tcl_precision cho phép bạn đặt số chữ số có nghĩa Tcl sẽ hiển thị khi nó chuyển đổi giá trị thực thành chuỗi, như bạn đề xuất.

Cài đặt mặc định là sáu:

expr 1.11111111 + 1.11111111 
=> 2.22222 

Nếu bạn đặt nó là 10 bạn sẽ nhận được:

set tcl_precision 10 
expr 1.11111111 + 1.11111111 
=> 2.22222222 

Nó không ảnh hưởng đến phương pháp thực tế Tcl sử dụng để đại diện cho số thực trong nội bộ , được ghi nhận là loại C gấp đôi, cung cấp khoảng 15 chữ số thập phân chính xác.

1

Tcl_precision hơi buồn cười vì có vẻ gây nhầm lẫn.

Nó chủ yếu ảnh hưởng đến cách nó in biến chứ không phải cách nó tính toán nội bộ.

Tcl nội bộ sử dụng loại gấp đôi C để tính toán được thực hiện bằng cách sử dụng cùng loại C kép không quan tâm đến giá trị tcl_precision.

Vì vậy, nếu bạn làm

set x 1.123456 

set tcl_preceision 2 

Nó sẽ hiển thị 1,12 nhưng nội nó vẫn là giá trị tăng gấp đôi đầy đủ ban đầu nó được thiết lập.

Nếu bạn thay đổi tcl_precision trở lại để nói "10"

Nó sẽ quay trở lại 1,123456

Vì vậy, bạn không thực sự kiểm soát chính xác tính toán như thế nào nó được hiển thị.

3

Trong Tcl 8.5, tcl_precision biến toàn cầu nên (có thể) được để lại một mình, vì cài đặt mặc định sử dụng số chữ số tối thiểu để biểu thị chính xác IEEE có liên quan. Điều đó không giống với việc sử dụng số chữ số cố định, mà thay vào đó là những gì mọi người thường muốn. Nếu họ muốn cái gì khác, cơ hội là họ đang nói về định dạng giá trị cho đầu ra; đó là khi bạn muốn sử dụng:

format %6f $doubleValue

hoặc một cái gì đó như thế để tạo ra một giá trị trong các định dạng thực tế họ muốn xem.

Các vấn đề liên quan