2010-02-18 67 views
77

Có một tùy chọn trong R để kiểm soát hiển thị chữ số. Ví dụ:Kiểm soát số chữ số thập phân trong đầu ra in trong R

options(digits=10) 

được cho là cung cấp kết quả tính toán trong 10 chữ số cho đến khi kết thúc phiên R. Trong tệp trợ giúp của R, định nghĩa cho tham số chữ số như sau:

chữ số: điều khiển số chữ số để in khi in giá trị số. Đó chỉ là một gợi ý. Giá trị hợp lệ là 1 ... 22 với mặc định

Vì vậy, nó nói đây chỉ là một gợi ý. Nếu tôi muốn luôn hiển thị 10 chữ số, không nhiều hay ít thì sao?

Câu hỏi thứ hai của tôi là, nếu tôi muốn hiển thị hơn 22 chữ số, tức là để tính toán chính xác hơn như 100 chữ số? Là nó có thể với cơ sở R, hoặc tôi cần một gói bổ sung/chức năng cho điều đó?

Edit: Nhờ gợi ý jmoy, tôi cố gắng sprintf("%.100f",pi) và nó đã cho

[1] "3.1415926535897931159979634685441851615905761718750000000000000000000000000000000000000000000000000000" 

trong đó có 48 số thập phân. Đây có phải là giới hạn tối đa R có thể xử lý không? Thực ra pi có số thập phân vô hạn.

+4

Chỉ 15 chữ số đầu tiên của pi là chính xác. So sánh với giá trị thực sự http://joyofpi.com/pi.html –

+1

Bạn nói đúng. Tại sao nó khác R? –

+3

Xem Câu hỏi thường gặp về R http://cran.r-project.org/doc/FAQ/R-FAQ.html#Why-doesn_0027t-R-think-these-numbers-are-equal_003f –

Trả lời

38

Lý do chỉ là một gợi ý là bạn có thể dễ dàng viết chức năng in bỏ qua giá trị tùy chọn. Các chức năng in ấn và định dạng tích hợp sử dụng giá trị options làm mặc định.

Đối với câu hỏi thứ hai, vì R sử dụng số học chính xác hữu hạn, câu trả lời của bạn không chính xác vượt quá 15 hoặc 16 chữ số thập phân, vì vậy nói chung, không cần thiết nữa. Các gói gmprcdd đối phó với nhiều số học chính xác (thông qua một interace đến thư viện gmp), nhưng điều này chủ yếu liên quan đến số nguyên lớn hơn là số thập phân cho đôi của bạn.

Mathematica hoặc Maple sẽ cho phép bạn cung cấp nhiều vị trí thập phân như trái tim bạn mong muốn.

EDIT:
Có thể hữu ích khi nghĩ về sự khác biệt giữa số thập phân và số liệu quan trọng. Nếu bạn đang thực hiện các kiểm tra thống kê dựa trên sự khác biệt vượt quá con số đáng kể thứ 15, thì phân tích của bạn gần như chắc chắn là rác.

Mặt khác, nếu bạn chỉ xử lý các số rất nhỏ, đó là ít vấn đề, vì R có thể xử lý số lượng nhỏ như .Machine$double.xmin (thường là 2e-308).

So sánh hai phân tích này.

x1 <- rnorm(50, 1, 1e-15) 
y1 <- rnorm(50, 1 + 1e-15, 1e-15) 
t.test(x1, y1) #Should throw an error 

x2 <- rnorm(50, 0, 1e-15) 
y2 <- rnorm(50, 1e-15, 1e-15) 
t.test(x2, y2) #ok 

Trong trường hợp đầu tiên, sự khác biệt giữa các số chỉ xảy ra sau nhiều số liệu quan trọng, vì vậy dữ liệu "gần như không đổi". Trong trường hợp thứ hai, Mặc dù kích thước của sự khác biệt giữa các con số là như nhau, so với độ lớn của các con số chính chúng lớn.


Như đã đề cập trong e3bo, bạn có thể sử dụng số dấu phẩy động chính xác nhiều bằng gói Rmpfr.

mpfr("3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825") 

Đây là chậm hơn và nhiều hơn nữa bộ nhớ chuyên sâu sử dụng hơn bình thường (độ chính xác kép) numeric vectơ, nhưng có thể hữu ích nếu bạn có một vấn đề kém lạnh hoặc thuật toán không ổn định.

+3

Khi [trang Rwiki này] (http://rwiki.sciviews.org/doku.php?id=misc:r_accuracy:high_precision_arithmetic) chứng minh, [gói Rmpfr] (http: //cran.at.r-project. org/web/packages/Rmpfr/index.html) cho phép số học dấu chấm động chính xác cao trong R. – e3bo

+0

Nhưng Rmpfr có thể được sử dụng bởi bất kỳ gói R nào để cải thiện độ chính xác của nó không? Hoặc nó chỉ có thể sử dụng các hàm được mã hóa bên trong nó? – skan

+2

Tôi đã suy nghĩ rằng, "Nếu bạn đang thực hiện các kiểm tra thống kê dựa trên sự khác biệt vượt quá con số đáng kể 15, thì phân tích của bạn gần như chắc chắn là rác." nhưng tôi tự hỏi số chữ số mà tôi sẽ kết luận là gì, và tôi nghĩ 5, nhưng tôi rất vui khi được sửa chữa. – PatrickT

29

Nếu bạn đang sản xuất toàn bộ đầu ra chính mình, bạn có thể sử dụng sprintf

> sprintf("%.10f",0.25) 
[1] "0.2500000000" 

Tôi không biết cách nào để buộc các chức năng mức độ cao hơn R để in một con số chính xác của các chữ số.

Hiển thị 100 chữ số không có ý nghĩa nếu bạn đang in số thường R, vì độ chính xác tốt nhất bạn có thể sử dụng đôi 64 bit là khoảng 16 chữ số thập phân (xem .Machine $ double.eps trên hệ thống của bạn). Các chữ số còn lại sẽ chỉ là rác.

+0

Trên thực tế, một số thử nghiệm chi-square đặc biệt mà tôi đã áp dụng cần hàng trăm số thập phân để cung cấp kết quả chính xác. Ngoài ra pi có hàng ngàn số thập phân. Đó là lý do tại sao tôi đã tự hỏi khoảng 100 chữ số trở lên. –

+12

pi có số thập phân vô hạn; điều đó không có nghĩa là máy tính có thể lưu trữ chúng. – Shane

+0

Tôi đoán đây là một kịch bản mà Mathematica vượt trội hơn R. – skan

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