ตัวอย่างเช่น,
int result;
result = 125/100;
หรือ
result = 43/100;
ผลลัพธ์จะเป็นพื้นของแผนกหรือไม่ พฤติกรรมที่กำหนดคืออะไร?
"I just throw the dam fraction part in the trash and move on with life"
ตัวอย่างเช่น,
int result;
result = 125/100;
หรือ
result = 43/100;
ผลลัพธ์จะเป็นพื้นของแผนกหรือไม่ พฤติกรรมที่กำหนดคืออะไร?
"I just throw the dam fraction part in the trash and move on with life"
คำตอบ:
ผลลัพธ์จะเป็นพื้นของแผนกหรือไม่ พฤติกรรมที่กำหนดคืออะไร?
ใช่ผลหารจำนวนเต็มของตัวถูกดำเนินการสองตัว
6.5.5 ตัวดำเนินการหลายตัว
6เมื่อจำนวนเต็มถูกหารผลลัพธ์ของ / โอเปอเรเตอร์คือความฉลาดทางพีชคณิตกับเศษส่วนที่ละทิ้ง 88)ถ้าความฉลาดทาง a / b แสดงออกได้การแสดงออก (a / b) * b + a% b จะเท่ากับ a
และเชิงอรรถที่เกี่ยวข้อง:
88) สิ่งนี้มักถูกเรียกว่า '' การตัดให้เป็นศูนย์ ''
แน่นอนว่าสองจุดที่ควรทราบคือ:
3การแปลงเลขคณิตปกติจะดำเนินการกับตัวถูกดำเนินการ
และ:
5ผลลัพธ์ของตัวดำเนินการ / คือผลหารจากส่วนของตัวถูกดำเนินการแรกโดยวินาที ผลลัพธ์ของตัวดำเนินการ% คือส่วนที่เหลือ ในการดำเนินการทั้งสองถ้าค่าของตัวถูกดำเนินการที่สองเป็นศูนย์พฤติกรรมจะไม่ได้กำหนด
[หมายเหตุ: เน้นเหมือง]
(a / b) * b + a % b == a
จะต้องมีความพึงพอใจและค่าสัมบูรณ์ของa % b
ต้องน้อยกว่าa
แต่ไม่ว่าจะa % b
เป็นค่าลบสำหรับค่าลบa
หรือb
ไม่ได้ระบุไว้
Dirkgently ให้คำอธิบายที่ยอดเยี่ยมของการหารจำนวนเต็มใน C99 แต่คุณควรรู้ด้วยว่าในการหารจำนวนเต็ม C89 ด้วยตัวถูกลบจะมีทิศทางที่กำหนดไว้
จากแบบร่าง ANSI C (3.3.5):
หากตัวถูกดำเนินการทั้งสองเป็นลบไม่ว่าผลลัพธ์ของตัวดำเนินการ / จะเป็นจำนวนเต็มที่มากที่สุดน้อยกว่าความฉลาดทางพีชคณิตหรือจำนวนเต็มที่น้อยที่สุดที่มากกว่าความฉลาดทางพีชคณิตเป็นการดำเนินการตามที่กำหนดเป็นสัญญาณของผลลัพธ์ของตัวดำเนินการ% หากสามารถหารผลหาร a / b ได้นิพจน์ (a / b) * b + a% b จะเท่ากับ a
ดังนั้นระวังตัวเลขติดลบเมื่อคุณติดกับคอมไพเลอร์ C89
มันเป็นเรื่องสนุกที่ C99 เลือกที่จะตัดให้เหลือศูนย์เพราะนั่นเป็นวิธีที่ FORTRAN ทำ ดูข้อความนี้ใน comp.std.c
reliable integer division
ว่าเป็นคุณสมบัติภาษาใหม่ *-*
น่าอัศจรรย์
expr1 / expr2
และexpr1 % expr2
ต้องสอดคล้องกันเมื่อทั้งสองอินสแตนซ์ของการexpr1
รวมวัตถุเดียวกันในลักษณะเดียวกันและในทำนองเดียวกันexpr2
แต่การเลือกตัดทอนกับการแบ่งพื้นไม่ได้ระบุไว้เป็นอย่างอื่น ที่จะได้รับอนุญาตให้สร้างรหัสมีประสิทธิภาพมากขึ้นโดยไม่ทำลายความเข้ากันได้มาก (และการใช้งานที่สามารถทำเอกสารพฤติกรรมเฉพาะถ้าเอียง)
ในกรณีที่ผลลัพธ์เป็นลบ C ตัดทอนเป็น 0 แทนที่จะปูพื้น - ฉันเรียนรู้การอ่านนี้ว่าทำไมการแบ่งจำนวนเต็มของ Python ถึงชั้นที่นี่เสมอ: ทำไม Python Integer Division Floors
filtered = (k - 1) * filtered + value + carry; carry = filtered % factor; filtered /= factor
, value
ซ้ำกับการเปลี่ยนแปลงค่านิยมของ มันทำให้การประมาณจำนวนเต็มเป็นเรื่องที่ดีสำหรับตัวกรอง lowpass ลำดับที่หนึ่งที่มีค่าคงที่เวลาk
... แต่มันก็สมมาตรหากการหารถูกตัดทอนและcarry
รับค่าลบ พฤติกรรมทั้งสองอย่างมีประโยชน์เป็นครั้งคราว
div
เป็นผู้ประกอบการส่วนปูพื้นและfactor
เป็นเลขคี่จากนั้นจะให้ผลผลิตพฤติกรรมที่สะอาดและสมมาตรค่าทั้งหมดขึ้นอยู่กับfiltered += (filter+(factor div 2)) div factor
INT_MAX-(factor div 2)
ผลลัพธ์จะเป็นพื้นของแผนกหรือไม่
ไม่ผลลัพธ์จะแตกต่างกันไป
พฤติกรรมที่กำหนดคืออะไร?
เพื่อให้ชัดเจนรอบพื้นไปทางลบอนันต์ในขณะที่การแบ่งจำนวนเต็มรอบไปที่ศูนย์ (ตัด)
สำหรับค่าบวกพวกเขาเหมือนกัน
int integerDivisionResultPositive= 125/100;//= 1
double flooringResultPositive= floor(125.0/100.0);//=1.0
สำหรับค่าลบนี้จะแตกต่างกัน
int integerDivisionResultNegative= -125/100;//=-1
double flooringResultNegative= floor(-125.0/100.0);//=-2.0
ฉันรู้ว่าผู้คนตอบคำถามของคุณ แต่ในแง่คนธรรมดา:
5 / 2 = 2
// เนื่องจากทั้ง 5 และ 2 เป็นเลขจำนวนเต็มและการหารจำนวนเต็มจะตัดทอนทศนิยมเสมอ
5.0 / 2 or 5 / 2.0 or 5.0 /2.0 = 2.5
// ที่นี่ทั้ง 5 หรือ 2 หรือทั้งสองมีทศนิยมดังนั้นความฉลาดที่คุณจะได้รับจะเป็นทศนิยม