Tôi đã thấy phạm vi số đại diện như [first1,last1)
và [first2,last2)
.
Tôi muốn biết một ký hiệu như vậy có nghĩa là gì.
Tôi đã thấy phạm vi số đại diện như [first1,last1)
và [first2,last2)
.
Tôi muốn biết một ký hiệu như vậy có nghĩa là gì.
Câu trả lời:
Dấu ngoặc có nghĩa là phần cuối của phạm vi được bao gồm - nó bao gồm phần tử được liệt kê. Dấu ngoặc đơn có nghĩa là kết thúc là độc quyền và không chứa phần tử được liệt kê. Vì vậy [first1, last1)
, phạm vi bắt đầu bằng first1
(và bao gồm nó), nhưng kết thúc ngay trước đó last1
.
Giả sử số nguyên:
Đó là một khoảng thời gian nửa mở .
[a,b]
bao gồm các điểm kết thúc.(a,b)
loại trừ chúng.Trong trường hợp của bạn, điểm cuối ở đầu khoảng được bao gồm, nhưng điểm cuối bị loại trừ. Vì vậy, nó có nghĩa là khoảng "đầu tiên <= x <last1".
Các khoảng thời gian nửa mở rất hữu ích trong lập trình vì chúng tương ứng với thành ngữ chung để lặp:
for (int i = 0; i < n; ++i) { ... }
Ở đây tôi nằm trong phạm vi [0, n).
Khái niệm ký hiệu khoảng xuất hiện trong cả Toán học và Khoa học Máy tính. Các ký hiệu toán học [
, ]
, (
, )
biểu thị miền (hoặc nhiều ) của một khoảng thời gian.
Dấu ngoặc [
và ]
phương tiện:
Dấu ngoặc đơn (
và )
phương tiện:
Một khoảng với các trạng thái hỗn hợp được gọi là "nửa mở" .
Ví dụ, một loạt các số nguyên liên tiếp từ 1 .. 10 (bao gồm) sẽ được ký hiệu như vậy:
Chú ý từ inclusive
đã được sử dụng. Nếu chúng ta muốn loại trừ điểm cuối nhưng "che" cùng phạm vi, chúng ta cần di chuyển điểm cuối:
Đối với cả hai cạnh trái và phải của khoảng thực tế có 4 hoán vị:
(1,10) = 2,3,4,5,6,7,8,9 Set has 8 elements
(1,10] = 2,3,4,5,6,7,8,9,10 Set has 9 elements
[1,10) = 1,2,3,4,5,6,7,8,9 Set has 9 elements
[1,10] = 1,2,3,4,5,6,7,8,9,10 Set has 10 elements
Làm thế nào điều này liên quan đến Toán học và Khoa học Máy tính?
Các chỉ mục mảng có xu hướng sử dụng một phần bù khác nhau tùy thuộc vào trường bạn đang ở:
Những khác biệt này có thể dẫn đến tinh tế hàng rào bài lỗi , aka, off-by-one lỗi khi thực hiện các thuật toán toán học chẳng hạn như cho-vòng.
Nếu chúng ta có một tập hợp hoặc mảng, nói về một vài số nguyên tố đầu tiên [ 2, 3, 5, 7, 11, 13, 17, 19, 23, 29 ]
, các nhà toán học sẽ coi phần tử đầu tiên là phần tử 1st
tuyệt đối . tức là sử dụng ký hiệu đăng ký để biểu thị chỉ mục:
Một số ngôn ngữ lập trình, trái ngược nhau, sẽ coi phần tử đầu tiên là phần tử zero'th
tương đối .
Vì các chỉ mục mảng nằm trong phạm vi [0, N-1] nên với mục đích rõ ràng, sẽ rất "tốt" để giữ cùng một giá trị số cho phạm vi 0 .. N thay vì thêm nhiễu văn bản như -1
sai lệch.
Ví dụ, trong C hoặc JavaScript, để lặp lại một mảng các phần tử N, lập trình viên sẽ viết thành ngữ chung i = 0, i < N
với khoảng [0, N) thay vì dài hơn một chút [0, N-1]:
function main() {
var output = "";
var a = [ 2, 3, 5, 7, 11, 13, 17, 19, 23, 29 ];
for( var i = 0; i < 10; i++ ) // [0,10)
output += "[" + i + "]: " + a[i] + "\n";
if (typeof window === 'undefined') // Node command line
console.log( output )
else
document.getElementById('output1').innerHTML = output;
}
<html>
<body onload="main();">
<pre id="output1"></pre>
</body>
</html>
Các nhà toán học, vì họ bắt đầu đếm từ 1, thay vào đó sẽ sử dụng i = 1, i <= N
danh pháp nhưng bây giờ chúng ta cần sửa lỗi bù trong một ngôn ngữ dựa trên zero.
ví dụ
function main() {
var output = "";
var a = [ 2, 3, 5, 7, 11, 13, 17, 19, 23, 29 ];
for( var i = 1; i <= 10; i++ ) // [1,10]
output += "[" + i + "]: " + a[i-1] + "\n";
if (typeof window === 'undefined') // Node command line
console.log( output )
else
document.getElementById( "output2" ).innerHTML = output;
}
<html>
<body onload="main()";>
<pre id="output2"></pre>
</body>
</html>
Ngoài ra :
Trong các ngôn ngữ được 0 dựa trên lập trình bạn có thể cần một kludge của nguyên tố một hình nộm zero'th sử dụng một thuật toán toán học 1-based. ví dụ: Python Index Bắt đầu
Ký hiệu khoảng cũng rất quan trọng đối với các số dấu phẩy động để tránh các lỗi tinh vi.
Khi xử lý các số dấu phẩy động, đặc biệt là trong Đồ họa máy tính (chuyển đổi màu sắc, hình học tính toán, nới lỏng / trộn hoạt hình, v.v.) thường sử dụng các số chuẩn hóa. Đó là, các số từ 0,0 đến 1,0.
Điều quan trọng là phải biết các trường hợp cạnh nếu các điểm cuối được bao gồm hoặc độc quyền :
Trong đó M là một số máy epsilon . Đây là lý do tại sao đôi khi bạn có thể thấy const float EPSILON = 1e-#
thành ngữ trong mã C (chẳng hạn 1e-6
) cho số dấu phẩy động 32 bit. Câu hỏi SO này Liệu EPSILON có đảm bảo được gì không? có một số chi tiết sơ bộ. Để có câu trả lời toàn diện hơn, hãy xem FLT_EPSILON
và David Goldberg Điều mà mọi nhà khoa học máy tính nên biết về số học dấu phẩy động của
Một số triển khai của trình tạo số ngẫu nhiên, random()
có thể tạo ra các giá trị trong phạm vi 0,0 .. 0,999 ... thay vì thuận tiện hơn 0,0 .. 1.0. Nhận xét đúng trong mã sẽ ghi lại điều này là [0,0,1.0) hoặc [0,0,1.0] vì vậy không có sự mơ hồ về việc sử dụng.
Thí dụ:
random()
màu sắc. Bạn chuyển đổi ba giá trị dấu phẩy động thành giá trị 8 bit không dấu để tạo pixel 24 bit với các kênh màu đỏ, xanh lục và xanh lam tương ứng. Tùy thuộc vào đầu ra khoảng thời gian của random()
bạn có thể kết thúc bằng near-white
(254.254.254) hoặc white
(255.255.255). +--------+-----+
|random()|Byte |
|--------|-----|
|0.999...| 254 | <-- error introduced
|1.0 | 255 |
+--------+-----+
Để biết thêm chi tiết về độ chính xác và độ mạnh của dấu phẩy động trong các khoảng thời gian, hãy xem Phát hiện va chạm trong thời gian thực của Christer Ericson , Chương 11 Độ mạnh của số , Phần 11.3 Cách sử dụng điểm nổi mạnh mẽ .
[first, last)
là một khoảng thời gian nửa mở như những người khác đã lưu ý. Trong một số sách giáo khoa, điều này cũng được viết[first, last>
và có cùng ý nghĩa, chỉ có cú pháp là khác nhau.