Rằng công việc này không hề nhỏ chút nào! Đây là một thuộc tính của biểu diễn dấu phẩy động của IEEE mà intorfloor = ⌊⋅⌋ nếu độ lớn của các số trong câu hỏi đủ nhỏ, nhưng các cách biểu diễn khác nhau có thể xảy ra trong đó int (floor (2.3)) có thể là 1.
Bài đăng này giải thích tại sao nó hoạt động trong phạm vi đó .
Trong một đôi, bạn có thể đại diện cho số nguyên 32 bit mà không có bất kỳ vấn đề. Không thể có bất kỳ vấn đề làm tròn. Chính xác hơn, nhân đôi có thể đại diện cho tất cả các số nguyên giữa và bao gồm 2 53 và -2 53 .
Giải thích ngắn : Một đôi có thể lưu trữ tới 53 chữ số nhị phân. Khi bạn yêu cầu nhiều hơn, số được đệm bằng số 0 ở bên phải.
Theo sau đó, 53 cái là số lớn nhất có thể được lưu trữ mà không cần đệm. Đương nhiên, tất cả các số (số nguyên) yêu cầu ít chữ số hơn có thể được lưu trữ chính xác.
Thêm một vào 111 (bỏ qua) 111 (53 cái) sẽ mang lại 100 ... 000, (53 số không). Như chúng ta biết, chúng ta có thể lưu trữ 53 chữ số, điều đó làm cho phần đệm bằng không bên phải.
Đây là nơi 2 53 đến từ.
Chi tiết hơn: Chúng ta cần xem xét cách thức hoạt động của dấu phẩy động IEEE-754.
1 bit 11 / 8 52 / 23 # bits double/single precision
[ sign | exponent | mantissa ]
Số này sau đó được tính như sau (không bao gồm các trường hợp đặc biệt không liên quan ở đây):
-1 ký hiệu × 1.mantissa × 2 số mũ - sai lệch
trong đó bias = 2 số mũ - 1 - 1 , tức là 1023 và 127 cho độ chính xác kép / đơn tương ứng.
Biết rằng nhân với 2 X chỉ đơn giản là dịch chuyển tất cả các bit X sang trái, dễ dàng nhận thấy rằng bất kỳ số nguyên nào cũng phải có tất cả các bit trong lớp phủ cuối cùng bên phải của dấu thập phân về 0.
Bất kỳ số nguyên nào trừ 0 đều có dạng sau trong nhị phân:
1x ... x trong đó x -es đại diện cho các bit ở bên phải của MSB (bit quan trọng nhất).
Bởi vì chúng tôi đã loại trừ 0, sẽ luôn có một MSB là một đơn vị, đó là lý do tại sao nó không được lưu trữ. Để lưu trữ số nguyên, chúng ta phải đưa nó vào dạng đã nói ở trên: -1 ký hiệu × 1.mantissa × 2 số mũ - độ lệch .
Điều đó nói giống như việc dịch chuyển các bit qua dấu thập phân cho đến khi chỉ còn MSB về phía bên trái của MSB. Tất cả các bit bên phải của dấu thập phân sau đó được lưu trữ trong lớp phủ.
Từ điều này, chúng ta có thể thấy rằng chúng ta có thể lưu trữ tối đa 52 chữ số nhị phân ngoài MSB.
Theo sau đó, số cao nhất trong đó tất cả các bit được lưu trữ rõ ràng là
111(omitted)111. that's 53 ones (52 + implicit 1) in the case of doubles.
Đối với điều này, chúng ta cần đặt số mũ, sao cho dấu thập phân sẽ được dịch chuyển 52 vị trí. Nếu chúng ta tăng số mũ lên một, chúng ta không thể biết chữ số bên phải sau dấu thập phân.
111(omitted)111x.
Theo quy ước, nó là 0. Đặt toàn bộ lớp phủ về 0, chúng tôi nhận được số sau:
100(omitted)00x. = 100(omitted)000.
Đó là số 1 theo sau là 53 số 0, 52 được lưu và 1 được thêm vào do số mũ.
Nó đại diện cho 2 53 , đánh dấu ranh giới (cả âm và dương) giữa chúng ta có thể biểu diễn chính xác tất cả các số nguyên. Nếu chúng ta muốn thêm một đến 2 53 , chúng ta sẽ phải đặt số 0 ẩn (ký hiệu là x
) thành một, nhưng điều đó là không thể.
math.floor
trả về một float trong v2.6 , nhưng nó trả về một số nguyên trong v3 . Tại thời điểm này (gần sáu năm sau OP), vấn đề này có thể hiếm khi xuất hiện.