Khi được biểu thị dưới dạng phao, số của bạn có số mũ là 16 (nghĩa là giá trị là số lần mantisse lần 2^16 hoặc 65536). Các mantisse sau đó trở thành
123456.123456/65536 = 1.8837909462890625
Để phù hợp với một phao 32-bit, các mantisse sẽ bỏ bớt 23 bit, vì vậy bây giờ nó trở nên 1.883791
. Khi được nhân lại bởi 65536
, số này sẽ trở thành 123456.125
.
Lưu ý 5
ở vị trí thứ ba sau dấu thập phân: thường trình đầu ra của C++ mà bạn đã sử dụng làm tròn nó lên, làm cho số cuối cùng của bạn trông giống như 123456.13
.
EDIT Giải thích về làm tròn: (comment Rick Regan)
Các tròn xảy ra đầu tiên trong hệ nhị phân (24 bit), trong thập phân để chuyển đổi nhị phân, và sau đó đến chữ số thập phân, trong printf
. Giá trị được lưu trữ là 1.1110001001000000001 x 2^16 = 1,8837909698486328125 x 2^16 = 123456.125. Nó in như 123456.13, nhưng chỉ vì Visual C++ sử dụng "round half from zero" làm tròn.
Rick cũng có một số outstanding article on the subject.
Nếu bạn muốn chơi với các số khác và biểu diễn nổi của chúng, đây là very useful IEEE-754 calculator.
cảm ơn tất cả mọi người vì câu trả lời. tôi hiểu rồi. tôi chỉ mặc dù nó sẽ thả các chữ số bị chồng chéo sau điểm, thay vì làm tròn nó. – Kosmos