2014-09-16 14 views
40

Tôi muốn biết liệu các quyền hạn của 10 có liên quan đến việc in ký hiệu khoa học trong bảng điều khiển hay không. Tôi đã tìm kiếm các tài liệu R và không tìm thấy bất cứ điều gì có liên quan, hoặc tôi thực sự hiểu.Tại sao quyền hạn của 10 bản in trong ký hiệu khoa học ở quyền lực thứ 5?

Trước hết, scipendigits xác lập cá nhân là

unlist(options("scipen", "digits")) 
# scipen digits 
#  0  7 

Bây giờ, quyền hạn của 10 được in thông thường lên đến sức mạnh thứ 4, và sau đó in chuyển sang ký hiệu khoa học tại sức mạnh thứ 5.

10^(1:4) 
# [1] 10 100 1000 10000 
10^(1:5) 
# [1] 1e+01 1e+02 1e+03 1e+04 1e+05 

Điều thú vị là, điều này không xảy ra đối với một số số khác lớn hơn 10.

11^(1:5) 
# [1]  11 121 1331 14641 161051 

Đánh giá từ những điều sau đây, 5 chữ số dường như có ý nghĩa.

100^(1:2) 
# [1] 100 10000 
100^(1:3) 
# [1] 1e+02 1e+04 1e+06 

Vì vậy, câu hỏi của tôi sau đó là:

Tại sao ký hiệu khoa học kích hoạt trong khoảng ngày 4 và quyền lực thứ 5 trong 10 và không cho con số khác? Số 5 có ý nghĩa không? Hơn nữa, tại sao 5 và không phải là một số gần hơn với các tùy chọn chữ số tối đa là 22?

Trả lời

42

Vâng, câu trả lời là thực sự có trong định nghĩa của scipen trong ?options, mặc dù nó khá khó khăn để hiểu những gì nó có nghĩa là không chơi xung quanh với một số ví dụ:

'scipen': số nguyên. Một hình phạt được áp dụng khi quyết định in giá trị số theo ký hiệu cố định hoặc theo hàm mũ. Tích cực giá trị thiên vị theo hướng cố định và tiêu cực theo hướng khoa học ký hiệu: ký hiệu cố định sẽ được ưu tiên trừ khi có nhiều hơn so với chữ số 'scipen' rộng hơn.

Để xem điều đó có nghĩa là gì, hãy kiểm tra ba cặp chính xác sau đây. Trong hai trường hợp đầu tiên, chiều rộng tính bằng ký tự cố định nhỏ hơn hoặc bằng chiều rộng của khoa học, do đó, ký hiệu cố định được ưu tiên. Tuy nhiên, trong trường hợp thứ ba, ký hiệu cố định rộng hơn (nghĩa là "nhiều hơn 0 chữ số"), vì số lượng 5 số không nhiều ký tự hơn 4 ký tự được sử dụng để biểu thị cùng giá trị bằng cách sử dụng e+nn. Do đó, trong trường hợp đó, ký hiệu khoa học được ưu tiên là.

1e+03 
1000 
# [1] 1000 

1e+04 
10000 
# [1] 10000 

1e+05 
100000  ## <- wider 
# [1] 1e+05 

Tiếp theo, kiểm tra một số số cũng kết thúc bằng nhiều số không, nhưng đại diện theo ký hiệu khoa học sẽ yêu cầu sử dụng .. Đối với những con số này, ký hiệu khoa học sẽ được sử dụng khi bạn có từ 6 số không trở lên (nghĩa là nhiều hơn 5 ký tự được lấy bởi một số . và các ký tự e+nn).

1.1e+06 
1100000 
# [1] 1100000 


1.1e+07 
11000000  ## <- wider 
# [1] 1.1e+07 

suy luận về sự đánh đổi được một chút phức tạp hơn đối với hầu hết số khác, mà các giá trị của cả hai options("scipen")options("digits") đi vào chơi, nhưng ý tưởng chung là giống hệt nhau.

Để xem một số biến chứng đáng ngạc nhiên xảy ra, bạn có thể muốn dán những điều sau vào bảng điều khiển của mình (có lẽ sau lần đầu tiên cố gắng dự đoán vị trí trong mỗi chuỗi chuyển sang ký hiệu khoa học).

100001 
1000001 
10000001 
100000001 
1000000001 
10000000001 
100000000001 
1000000000001 

111111 
1111111 
11111111 
111111111 
1111111111 
11111111111 
111111111111 
1111111111111 
8

Tôi nhầm lẫn về câu hỏi của bạn; hoặc, đặc biệt hơn, cách bạn sẽ sử dụng câu trả lời cho câu hỏi này bằng cách nào đó thay đổi/kiểm soát hành vi của R. Bạn có đang định dạng số theo một cách nào đó không? Có những cách tốt hơn để làm điều đó.

Khi bạn nhập các giá trị như vậy, kết quả được chạy ngầm mặc dù một trong các lệnh print() được định dạng "độc đáo" cho bảng điều khiển. Bất cứ khi nào mọi thứ phải nhìn "đẹp" trên màn hình, mã để làm điều đó thường xấu xí. Ở đây hầu hết mã đó được quản lý bởi hàm formatReal và hàm trợ giúp . Các bài hát sau những thông tin sau cho một số

/* for a number x , determine 
* sgn = 1_{x < 0} {0/1} 
* kpower = Exponent of 10; 
* nsig = min(R_print.digits, #{significant digits of alpha}) 
* roundingwidens = 1 if rounding causes x to increase in width, 0 otherwise 
* 
* where |x| = alpha * 10^kpower and 1 <= alpha < 10 
*/ 

Sau đó các chức năng cũ sử dụng thông tin này để cố gắng làm cho "đẹp" số tìm kiếm bằng cách cân bằng các giá trị bên trái và bên phải của nơi thập phân. Đó là sự kết hợp của nhiều thứ như thứ tự của số lượng và số chữ số có nghĩa cũng như ảnh hưởng môi trường tạo thành tùy chọn scipen, v.v.

print() chỉ có nghĩa là làm cho mọi thứ trông đẹp hơn. Chính xác những gì là tốt đẹp phụ thuộc vào tất cả các giá trị trong một vector. Bạn sẽ tìm thấy một vài điểm ngắt cứng trong mã đó; nó rất thích nghi. Không có cách nào dễ dàng để mô tả ngắn gọn tất cả mọi thứ nó làm trong trường hợp chung (đó là những gì nó âm thanh như bạn đang yêu cầu).

Điều duy nhất chắc chắn là nếu bạn cần định dạng số theo một cách nhất định, hãy sử dụng chức năng như sprintf() hoặc formatC() cho phép kiểm soát chính xác.

Tất nhiên, hành vi này phụ thuộc vào class() và tôi đã chỉ định công cụ formatReal vì đó là nơi những điều phức tạp nhất xảy ra.Nhưng quan sát sự khác biệt khi bạn sử dụng số nguyên

c(10, 100, 1000, 10000, 100000) 
# [1] 1e+01 1e+02 1e+03 1e+04 1e+05 
c(10L, 100L, 1000L, 10000L, 100000L) 
# [1]  10 100 1000 10000 100000 
+0

Để làm rõ, tôi không cố thay đổi hành vi. Thay vào đó, tôi tự hỏi tại sao điều này dường như chỉ xảy ra cho ví dụ: 10^(1: 5) và không cho 11^(1: 5). Các bội số của 10 có vẻ quan trọng, và do đó làm 5 chữ số khi số là bội số của 10. Nhưng nó có ý nghĩa rằng R là "làm đẹp" các con số. –

+0

Sự khác biệt trong '10^(1: 5)' và '11^(1: 5)' chủ yếu là do sự khác biệt về số chữ số có nghĩa. Khi bạn đang làm quyền hạn của 10, bạn không mất thông tin khi bạn chuyển sang ký hiệu khoa học. Nhưng khi bạn sử dụng 11 làm cơ sở, bạn có khả năng sẽ giảm số. – MrFlick

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