Trang Chủ Tài chính Cá nhân Một vài điều kỳ quái về toán học Java - núm vú

Một vài điều kỳ quái về toán học Java - núm vú

Mục lục:

Video: The most unexpected answer to a counting puzzle 2025

Video: The most unexpected answer to a counting puzzle 2025
Anonim

Tin hay không, các máy tính - thậm chí là các chương trình mạnh nhất - có những hạn chế nhất định khi thực hiện tính toán. Những hạn chế này thường không đáng kể, nhưng đôi khi chúng lén lút và cắn bạn. Đây là những điều bạn cần để xem ra cho khi làm toán học trong Java.

Tràn số dư

Vấn đề cơ bản với các kiểu số nguyên là họ có một kích thước cố định. Do đó, có giới hạn về kích thước của các số có thể được lưu trữ trong các biến kiểu ngắn , int hoặc dài . Mặc dù các biến dài có thể chứa các con số rất lớn, sớm hay muộn bạn gặp một con số quá lớn để phù hợp với ngay cả biến dài .

Được rồi, xem xét ví dụ này (đã được thừa nhận):

int a = 1000000000;

Hệ thống. ngoài. println (a);

a + = 1000000000;

Hệ thống. ngoài. println (a);

a + = 1000000000;

Hệ thống. ngoài. println (a);

a + = 1000000000;

Hệ thống. ngoài. println (a);

Ở đây bạn mong đợi giá trị a để lớn hơn sau mỗi lần bổ sung. Nhưng đây là đầu ra được hiển thị:

1000000000

2000000000

-1294967296

-294967296

Sự bổ sung đầu tiên dường như có hiệu quả, nhưng sau đó, con số này trở nên âm tính! Đó là vì giá trị đã đạt đến giới hạn kích thước của kiểu dữ liệu int . Thật không may, Java không cho bạn biết rằng lỗi này đã xảy ra. Nó chỉ đơn giản là nhồi nhét biến int như đầy đủ các bit, có thể loại bỏ bất kỳ bit nào không phù hợp và hy vọng rằng bạn không nhận thấy. Vì đường lưu giá trị âm, giá trị tích cực lớn đột nhiên trở thành giá trị âm lớn.

Đạo đức của câu chuyện là nếu bạn làm việc với các số nguyên lớn, bạn nên sử dụng dài chứ không phải int , vì dài có thể chứa nhiều số lớn hơn int . Nếu chương trình của bạn đối phó với các con số đủ lớn để là một vấn đề cho dài , hãy xem xét sử dụng các kiểu điểm nổi thay thế. Các kiểu điểm nổi có thể xử lý các giá trị lớn hơn dài , và chúng cho bạn biết khi bạn vượt quá khả năng của chúng.

Điểm nổi điểm trôi nổi

Số điểm nổi có vấn đề của riêng mình. Đối với người mới bắt đầu, số điểm nổi được lưu trữ bằng hệ thống số nhị phân (cơ sở 2), nhưng con người làm việc với số trong hệ thống số thập phân (cơ số 10). Thật không may, chuyển đổi số chính xác giữa hai hệ thống đôi khi không thể. Đó là bởi vì ở bất kỳ số cơ sở nào, các phân số nhất định không thể được đại diện chính xác.

Một ví dụ: Cơ sở 10 không có cách nào để đại diện chính xác cho phần 1/3. Bạn có thể ước lượng nó là 0. 3333333, nhưng cuối cùng bạn đạt đến giới hạn của bao nhiêu chữ số bạn có thể lưu trữ, vì vậy bạn phải dừng lại. Ở cơ sở 2, điều xảy ra rằng một trong những phân số bạn không thể đại diện chính xác là giá trị thập phân 1/10. Nói cách khác, biến float hoặc double không thể biểu diễn chính xác 0. 1 . Hãy thử chạy mã này:

float x = 0. 1f;

NumberFormat nf = Số định dạng. getNumberInstance ();

nf. setMinimumFractionDigits (10);

Hệ thống. ngoài. println (định dạng nf. (x));

Kết quả đầu ra là:

0. 1000000015

Mặc dù

0. 1000000015 đóng đến 0. 1 , nó không chính xác. Trong hầu hết các trường hợp, phép toán điểm nổi của Java gần đủ không quan trọng. Lề của lỗi là cực kỳ nhỏ. Nếu bạn đang sử dụng Java để đo kích thước ngôi nhà của bạn, bạn cần một kính hiển vi điện tử để thông báo lỗi. Nếu bạn đang viết các ứng dụng đối phó với các giao dịch tài chính, tuy nhiên, việc làm tròn thông thường đôi khi làm tăng các lỗi để làm cho chúng đáng kể. Bạn có thể tính một đồng penny quá nhiều hoặc quá ít thuế doanh thu. Và trong trường hợp cực đoan, hóa đơn của bạn có thể có lỗi bổ sung rõ ràng.

Các loại số nguyên được lưu trữ trong nhị phân, tất nhiên. Nhưng các số nguyên không phải là những lỗi giống nhau mà các kiểu dấu chấm động là - bởi vì số nguyên không đại diện cho các phân số - vì vậy bạn không phải lo lắng về loại lỗi này cho

số nguyên. Phân chia theo số không Theo các quy tắc cơ bản của toán học, bạn không thể chia một số cho số không. Lý do đơn giản: Phân chia là nghịch đảo của phép nhân - có nghĩa là nếu

a * b = c

, cũng đúng là a = c / b . Nếu bạn cho phép b bằng 0, thì phân chia sẽ là vô nghĩa, bởi vì bất kỳ số nào bằng 0 đều bằng không. Do đó, cả c cũng phải là 0. Nói tóm lại, các nhà toán học đã giải quyết tình thế tiến thoái lưỡng nan này bằng cách nói rằng sự phân chia bằng không chỉ đơn giản là không được phép. Vậy điều gì sẽ xảy ra nếu bạn làm

cố gắng chia số không bằng một chương trình Java? Câu trả lời phụ thuộc vào việc bạn đang chia số nguyên hoặc số điểm trôi nổi. Nếu bạn đang chia số nguyên, câu lệnh cố gắng phân chia bằng số không gây nghẽn cái được gọi là ngoại lệ, đó là một cách không lịch sự để làm hỏng chương trình. Có một cách để ngăn chặn ngoại lệ này để cho phép chương trình của bạn tiếp tục mà bạn không tìm thấy ở đây. Trong thời gian chờ đợi, bất kỳ chương trình nào bạn viết mà cố gắng phân chia số nguyên bằng số không bị treo. Nếu bạn cố gắng phân chia một kiểu điểm nổi bằng số không, kết quả không phải là đột ngột. Thay vào đó, Java chỉ định cho kết quả điểm nổi một trong những giá trị đặc biệt được liệt kê trong bảng dưới đây. Các đoạn sau giải thích làm thế nào các giá trị đặc biệt được xác định:

Nếu bạn chia một số bằng không, và dấu hiệu của cả hai con số là như nhau, kết quả là vô cùng tích cực.

0. 0

  • chia cho 0. 0 là tích cực vô cùng, như là -34. 0 chia cho -0. 0 . Nếu bạn chia một số cho số không, và các dấu hiệu của các con số là khác nhau, kết quả là vô cực tiêu cực. -40. 0
  • chia cho 0. 0 là độ âm vô cực, như 34. 0 chia cho 0. 0 . Nếu bạn chia số không bằng số không, kết quả không phải là số (NaN), bất kể các dấu hiệu. Hằng số đặc biệt của phao và các lớp kép
  • Hằng
Ý nghĩa
POSITIVE_INFINITY Độ vô cực dương
NEGATIVE_INFINITY Phép cực đại
NaN Không phải là
Các số 0 tại điểm trôi nổi có thể dương và âm. Java xem các số 0 dương và âm với số lượng bằng nhau. Nếu bạn cố gắng in một giá trị điểm nổi có một trong các giá trị đặc biệt này, Java sẽ chuyển giá trị đó thành một chuỗi thích hợp. Giả sử bạn thực hiện các câu lệnh sau:

double x = Math. sqrt (-50); / / Không phải là số

gấp đôi y = x;

if (x == y)

Hệ thống. ngoài. println ("x bằng y");

Kết quả giao diện điều khiển là

Vô hạn

Nếu

i

-50. 0 , giao diện điều khiển sẽ hiển thị -Infinity , và nếu i bằng không, giao diện điều khiển sẽ hiển thị NaN . Các đoạn văn sau mô tả một số bit cuối của sự kỳ quặc: NaN

không bằng với chính nó, có thể có một số hậu quả kỳ lạ. Ví dụ:

  • gấp đôi x = Toán. sqrt (-50); / / Không phải là số gấp đôi y = x;

if (x == y)

Hệ thống. ngoài. println ("x bằng y");

Chỉ cần giả định, vì lợi ích của đối số, câu lệnh

if

kiểm tra xem biến x bằng biến y không. Vì bài kiểm tra này ngay lập tức tuân theo câu lệnh gán gán giá trị x đến y , bạn có thể giả định một cách an toàn rằng x bằng y đúng? Không đúng. Vì x

NaN , y cũng NaN . NaN không bao giờ được coi là bằng bất kỳ giá trị nào khác, bao gồm cả NaN khác. Do đó, việc so sánh trong nếu tuyên bố thất bại. Một hậu quả kỳ lạ: Bạn không thể giả định rằng một số trừ đi chính nó luôn luôn là số không. Hãy xem xét tuyên bố này: đôi z = x - x; / / không nhất thiết phải bằng không

  • Không nên tuyên bố này luôn luôn đặt

z

đến mức không? Không phải nếu x NaN . Trong trường hợp đó, không phải là một số trừ-không một số vẫn không phải là một số. Một điều kỳ lạ nữa: Bất kỳ phép toán nào liên quan đến kết quả vô hạn đều có kết quả là vô hạn hoặc NaN

  • . Infinity + 5, ví dụ, vẫn bằng vô cùng, vì vậy Buzz Lightyear gọi "Đến vô cùng và xa hơn! "Chỉ là sẽ không xảy ra. Nhưng vô cực trừ đi vô cực mang lại cho bạn … NaN .
Một vài điều kỳ quái về toán học Java - núm vú

Lựa chọn của người biên tập

Cách lọc một nguồn dữ liệu kết hợp trong Word 2013 - núm vú

Cách lọc một nguồn dữ liệu kết hợp trong Word 2013 - núm vú

Trong tài liệu Word 2013, lọc một nguồn dữ liệu loại trừ các bản ghi nhất định (hoặc xem một cách khác, nó chỉ bao gồm một số bản ghi) dựa trên một hoặc nhiều tiêu chí mà bạn chỉ định. Ví dụ: bạn có thể muốn chỉ bao gồm các địa chỉ từ một thành phố hoặc tiểu bang nhất định, hoặc chỉ những địa chỉ phù hợp với địa chỉ ...

Cách Tìm Stuff bạn không thể gõ trong Word 2007 - núm vú

Cách Tìm Stuff bạn không thể gõ trong Word 2007 - núm vú

Word 2007 giúp tìm các ký tự đặc biệt, không in được trong tài liệu của bạn. Sử dụng hộp thoại Tìm và Thay thế, bạn có thể tìm kiếm những thứ như tab, dấu phân cách, dấu thập phân, khoảng trống và những thứ khác mà bạn không thể tạo ra từ bàn phím. Gọi hộp thoại Tìm và Thay thế. Nếu cần thiết, hãy nhấp vào nút Thêm để ...

Cách Tìm Định dạng trong Word 2007 - núm vú

Cách Tìm Định dạng trong Word 2007 - núm vú

Bạn có thể sử dụng lệnh Tìm để đánh cắp tài liệu Word 2007 của bạn để định dạng thông tin. Ví dụ, nếu bạn chỉ muốn tìm những trường hợp của từ lie có chữ đậm, bạn có thể làm điều đó. Ví dụ này tìm kiếm trứng ngỗng văn bản với kích thước phông chữ là 24 điểm trong một ...

Lựa chọn của người biên tập

Làm thế nào để Thoả Nhận Hợp Đồng Máy chủ Web - núm vú

Làm thế nào để Thoả Nhận Hợp Đồng Máy chủ Web - núm vú

Trên thực tế, đa số của máy chủ web không hoàn lại tiền nếu bạn để lại trước khi thời hạn hợp đồng của bạn kết thúc. Trong thực tế, nếu bạn có một thỏa thuận giá rẻ trên hosting của bạn, nó có thể có các điều khoản và điều kiện yêu cầu bạn xem ra thời hạn của hợp đồng hoặc trả tiền cho đặc quyền ...

Cách quản lý tập tin với Control Panel của Website - núm vú

Cách quản lý tập tin với Control Panel của Website - núm vú

Bảng điều khiển của bạn cung cấp cho bạn một cách tiện dụng để quản lý các tệp của bạn mà không cần máy chủ FTP được lưu trữ trên web. Đây là một cái gì đó phổ biến cho hầu hết các bảng điều khiển nhưng đôi khi có nhãn khác nhau một chút. Ví dụ, hầu hết các máy chủ gọi nó là File Manager, nhưng DreamHost gọi nó là webFTP. Sử dụng Trình quản lý Tệp là

Cách Quản lý Người dùng với Quản lý Máy chủ Web - núm vú

Cách Quản lý Người dùng với Quản lý Máy chủ Web - núm vú

Cây thư mục riêng trên máy chủ nơi tập tin của nó được giữ. Là chủ sở hữu của máy chủ, bạn có quyền truy cập superuser cho toàn bộ máy chủ, có nghĩa là bạn có thể xem tất cả các tệp tin của chủ tài khoản khác. Tất cả các tập tin tài khoản được lưu giữ trong các thư mục bên trong một thư mục gọi là home, ...

Lựa chọn của người biên tập

Tạo một Cột trang web mới trong SharePoint 2010 - núm vú

Tạo một Cột trang web mới trong SharePoint 2010 - núm vú

SharePoint 2010 có một thực thể cột trang web cho phép bạn để sử dụng lại các cột trên nhiều danh sách. Khi bạn tạo một cột mới trong danh sách của mình, bạn tạo ra một cột danh sách - có nghĩa cột chỉ có thể được sử dụng trong danh sách đó. Các cột của trang web được tạo ở cấp cao nhất của trang web nhóm của bạn và có thể ...

Tạo Tuỳ chỉnh Chủ đề cho SharePoint 2010 Sử dụng PowerPoint - núm vú

Tạo Tuỳ chỉnh Chủ đề cho SharePoint 2010 Sử dụng PowerPoint - núm vú

Cho nhiều nhà thiết kế trang web và chủ sở hữu SharePoint 2010 , ý tưởng để có thể tùy chỉnh chủ đề của họ là rất thú vị. Mặt khác, nhiệm vụ chọn nhiều màu có thể có vẻ khó chịu với những người biết họ thích gì khi họ nhìn thấy nó nhưng gặp sự cố khi lựa chọn. Nếu bạn ở trong ...

Tạo trang web mới trong SharePoint 2010 - núm vú

Tạo trang web mới trong SharePoint 2010 - núm vú

Bạn có thể tạo một bộ sưu tập trang web mới trong SharePoint theo hai cách - bằng cách sử dụng Quản trị Trung tâm hoặc thông qua Tạo trang web Tự phục vụ. Sử dụng Quản trị Trung tâm đòi hỏi các quyền được cấp phép, thường là hạn chế đối với nhân viên CNTT. Tạo trang web tự tạo là một tính năng của SharePoint cho phép CNTT trao quyền cho việc tạo bộ sưu tập trang web mới ...