Ví dụ,
int result;
result = 125/100;
hoặc là
result = 43/100;
Kết quả sẽ luôn là sàn của bộ phận? Hành vi được xác định là gì?
"I just throw the dam fraction part in the trash and move on with life"
Ví dụ,
int result;
result = 125/100;
hoặc là
result = 43/100;
Kết quả sẽ luôn là sàn của bộ phận? Hành vi được xác định là gì?
"I just throw the dam fraction part in the trash and move on with life"
Câu trả lời:
Kết quả sẽ luôn là sàn của bộ phận? Hành vi được xác định là gì?
Có, thương số nguyên của hai toán hạng.
6.5.5 Toán tử nhân
6 Khi các số nguyên được chia, kết quả của toán tử / là thương số đại số với bất kỳ phần phân số nào bị loại bỏ. 88) Nếu thương số a / b là đại diện, biểu thức (a / b) * b + a% b sẽ bằng a.
và chú thích tương ứng:
88) Điều này thường được gọi là "cắt ngắn về không".
Tất nhiên hai điểm cần lưu ý là:
3 Các chuyển đổi số học thông thường được thực hiện trên các toán hạng.
và:
5 Kết quả của toán tử / là thương số từ việc chia toán hạng thứ nhất cho toán tử thứ hai; kết quả của toán tử% là phần còn lại. Trong cả hai thao tác, nếu giá trị của toán hạng thứ hai bằng 0, thì hành vi không được xác định.
[Lưu ý: Nhấn mạnh mỏ]
(a / b) * b + a % b == a
phải được thỏa mãn, và giá trị tuyệt đối a % b
phải nhỏ hơn a
, nhưng cho dù a % b
là âm đối với âm a
hay b
không được chỉ định.
Dirkgently đưa ra một mô tả tuyệt vời về phân chia số nguyên trong C99, nhưng bạn cũng nên biết rằng trong phân chia số nguyên C89 với toán hạng âm có hướng xác định thực hiện.
Từ dự thảo ANSI C (3.3.5):
Nếu một toán hạng là âm, thì kết quả của toán tử / là số nguyên lớn nhất nhỏ hơn thương số đại số hay số nguyên nhỏ nhất lớn hơn thương số đại số được xác định theo thực thi, như là dấu hiệu của kết quả của toán tử%. Nếu thương số a / b là đại diện, biểu thức (a / b) * b + a% b sẽ bằng a.
Vì vậy, xem ra với số âm khi bạn bị mắc kẹt với trình biên dịch C89.
Thật là một sự thật thú vị khi C99 chọn cách cắt ngắn về 0 vì đó là cách FORTRAN đã làm điều đó. Xem tin nhắn này trên comp.std.c.
reliable integer division
như là một tính năng ngôn ngữ mới. Tuyệt vời *-*
.
expr1 / expr2
và expr1 % expr2
phải nhất quán với nhau khi cả hai trường expr1
hợp kết hợp cùng một đối tượng theo cùng một cách, và tương tự như vậy expr2
, nhưng sự lựa chọn cắt ngắn so với phân chia trôi nổi là không xác định. Điều đó sẽ cho phép tạo mã hiệu quả hơn mà không phá vỡ nhiều khả năng tương thích (và việc triển khai có thể ghi lại hành vi cụ thể nếu nghiêng)
Trường hợp kết quả là âm, C cắt ngắn về 0 thay vì sàn - Tôi đã học được cách đọc này về lý do tại sao phân chia số nguyên Python luôn luôn ở đây: Tại sao Sàn phân chia số nguyên của Python
filtered = (k - 1) * filtered + value + carry; carry = filtered % factor; filtered /= factor
, lặp đi lặp lại với các giá trị thay đổi của value
. Nó tạo ra một xấp xỉ số nguyên đẹp cho bộ lọc thông thấp thứ nhất với hằng số thời gian k
... nhưng nó chỉ đối xứng nếu phân chia bị cắt cụt và carry
nhận các giá trị âm. Đôi khi cả hai hành vi để phân chia đều có ích.
div
là một toán tử phân chia nổi và factor
là số lẻ, thì filtered += (filter+(factor div 2)) div factor
sẽ mang lại hành vi sạch và đối xứng cho tất cả các giá trị lên đến INT_MAX-(factor div 2)
.
Có, kết quả luôn luôn bị cắt về không. Nó sẽ làm tròn hướng tới giá trị tuyệt đối nhỏ nhất.
-5 / 2 = -2
5 / 2 = 2
Đối với các giá trị được ký không dấu và không âm, điều này giống như sàn (làm tròn theo hướng -Infality).
Kết quả sẽ luôn là sàn của bộ phận?
Không. Kết quả khác nhau, nhưng biến thể chỉ xảy ra đối với các giá trị âm.
Hành vi được xác định là gì?
Để làm cho nó rõ ràng làm tròn các vòng về phía vô cực âm, trong khi phép chia số nguyên làm tròn về 0 (cắt ngắn)
Đối với các giá trị tích cực, chúng giống nhau
int integerDivisionResultPositive= 125/100;//= 1
double flooringResultPositive= floor(125.0/100.0);//=1.0
Đối với giá trị âm, điều này là khác
int integerDivisionResultNegative= -125/100;//=-1
double flooringResultNegative= floor(-125.0/100.0);//=-2.0
Tôi biết mọi người đã trả lời câu hỏi của bạn nhưng theo thuật ngữ giáo dân:
5 / 2 = 2
// vì cả 5 và 2 là số nguyên và phép chia số nguyên luôn cắt các số thập phân
5.0 / 2 or 5 / 2.0 or 5.0 /2.0 = 2.5
// ở đây 5 hoặc 2 hoặc cả hai đều có số thập phân do đó thương số bạn sẽ nhận được sẽ ở dạng thập phân.