Chỉ có một loại số trong thiết kế ngôn ngữ


8

Tôi hiện đang tìm hiểu về xây dựng trình biên dịch và thiết kế ngôn ngữ và tôi đang suy nghĩ về những kiểu dữ liệu bản địa nào tôi muốn hỗ trợ trong ngôn ngữ của mình. Bây giờ có rất nhiều ngôn ngữ tạo ra sự khác biệt giữa số nguyên và số thực. Tuy nhiên, tôi nhớ đã xem một cuộc nói chuyện của Douglas Crockford, trong đó ông nói:

Có một loại số duy nhất trong hệ thống có nghĩa là bạn không thể tạo ra lỗi bằng cách chọn loại số sai

Ông cũng đề cập rằng ông khuyến nghị một đại diện số khác với IEEE-754 thường được sử dụng (vui lòng sửa cho tôi nếu tôi sai), được đặt tên là DEC64. Do đó, câu hỏi của tôi: Đối với một ngôn ngữ có mục đích chung, chủ yếu tập trung vào giáo dục, tôi nên sử dụng đại diện số nào?

EDIT: Với trọng tâm giáo dục, tôi đang nói về sự tiến bộ của bản thân trong việc học về trình biên dịch, không phải để giáo dục người khác.


4
Không có câu trả lời đúng ở đây. Đối với mục đích giáo dục, tôi khuyên bạn nên sử dụng số thập phân chính xác tùy ý (ví dụ: Javas BigDecimal và BigInteger). Có tất cả sự linh hoạt mà người ta có thể yêu cầu, tránh phải giải thích các lỗi làm tròn ngay khi bắt đầu và hành xử rất giống với các máy tính mà học sinh đã quen.
marstato

5
Câu hỏi bắt đầu hỏi về các loại số sau đó chuyển sang biểu diễn số . Đó là loại khó hiểu, cũng có thể nhầm lẫn. Hơn nữa, ngay cả các câu trả lời dựa trên ý kiến ​​cũng có thể bị sai lệch nếu bạn không thể làm rõ trọng tâm giáo dục mà bạn đề cập: đó có phải là ngôn ngữ để mọi người học lập trình (như Pascal), một dự án cho chính bạn giáo dục, một ngôn ngữ được sử dụng bởi việc học đếm, ...?
Đánh dấu hiệu suất cao

1
Cảm ơn, tôi đã chỉnh sửa câu hỏi. Tôi đang đề cập đến cả số LOẠI và ĐẠI DIỆN bởi vì tôi đã cứu chữa có lẽ ai đó có thể chỉ cho tôi hướng đi đúng cho cả hai vấn đề của mình :)
Niklas Vest

Chỉ cần nhớ rằng, có thể loại bỏ một loại lỗi không nhất thiết có nghĩa là số lượng lỗi mạng của bạn giảm.
tên gì

1
"Có trọng tâm giáo dục chủ yếu" Giống như giáo dục khoa học máy tính? Bởi vì một vấn đề bạn sẽ gặp phải từ quan điểm thiết kế ngôn ngữ là hỗ trợ các toán tử nhị phân như thay đổi số học và logic. (Điều này cũng tuân theo các quy tắc ngữ pháp ưu tiên toán tử nếu bạn bao gồm các toán tử nhị phân để tìm hiểu cách ngôn ngữ xử lý mọi thứ). Nếu bạn không quan tâm đến những thứ đó thì bạn có thể sử dụng một loại dữ liệu duy nhất. (JS có một loại "Số" duy nhất nếu bạn muốn xem một cách kỳ lạ để xử lý mọi việc).
Sirisian

Câu trả lời:


11

Chúng tôi có đại diện số khác nhau nói chung bởi vì chúng có điểm mạnh và điểm yếu khác nhau, có thể là tốc độ, độ chính xác hoặc phạm vi. Ngoài ra, đây phải là trường hợp vì chúng ta không thể biểu diễn tất cả các số thực với bộ nhớ hữu hạn, chúng ta luôn phải chọn một số mà chúng ta không thể biểu diễn chính xác.

Trích dẫn Doug Crockford mà bạn có là ngu ngốc ở biên giới, nếu bạn chỉ có thể chọn một đại diện thì OK, bạn không thể chọn sai, nhưng bạn cũng không thể chọn đúng. tức là sự lựa chọn duy nhất của bạn sẽ làm việc cho một số sử dụng nhưng không phải cho tất cả.

Đúng là một số đại diện có lẽ tốt hơn khi lựa chọn goto đầu tiên DEC64 có vẻ hợp lý ở đây. Đây là một biểu diễn dấu phẩy động thập phân, do đó, nó sẽ ít gây ngạc nhiên hơn so với IEEE-754 (là dấu phẩy động nhị phân) trong hầu hết các tình huống khi mọi người có xu hướng nghĩ theo số thập phân, ví dụ như nó có thể biểu thị chính xác 0,3. Nó vẫn sẽ có vấn đề về đại diện trong một số trường hợp, ví dụ như cộng các số thực sự lớn và thực sự nhỏ lại với nhau

để đọc thêm, tôi đề nghị Richard Harris 'loạt bài viết' tại sao X không sửa chữa bạn làm nổi bật các điểm xanh '


liên kết đến các bài viết của Harris có thể được tìm thấy trong câu trả lời này cho một câu hỏi liên quan đến phần
mềmengineering.stackexchange.com/a/101197/10563

2

Đối với một ngôn ngữ chung, các con số nên hành xử giống như những người được dạy trong lớp toán. Chỉ những ngôn ngữ có mục đích đặc biệt, như những ngôn ngữ dành cho trình điều khiển thiết bị, mới có toán học đặc biệt.

Tôi khuyên bạn nên sử dụng các số chính xác tùy ý thay vì các số chính xác cố định. Vâng, họ chậm hơn nhưng họ cư xử như mọi người mong đợi con số hành xử. Đặt giới hạn nhân tạo lên chúng sẽ được báo cáo là một lỗi.


5
Thật không may, những con số như những người trong lớp toán không thể được biểu diễn trong bộ nhớ hữu hạn, đó là toàn bộ lý do tại sao chúng ta có rất nhiều cách biểu diễn số khác nhau ở vị trí đầu tiên.
Jörg W Mittag

4
Và báo cáo "hết bộ nhớ" khi ai đó cố gắng tính toán SQRT (2.0) có thể cũng sẽ bị coi là một lỗi.
Simon B

3
Vì vậy, loại số duy nhất của bạn trong thực tế là vô số loại số tùy thuộc vào một vài tham số.
Ded repeatator

2
@shawnhcorey: Vì vậy, bạn muốn yêu cầu chỉ định thủ công độ chính xác cho từng thao tác thay thế?
Ded repeatator

2
@shawnhcorey Nhà nước toàn cầu là xấu xa. Và bây giờ nó can thiệp vào tất cả số học? Ngoài ra, hai biến với các tham số khác nhau sẽ tương tác như thế nào?
Ded repeatator
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.