Наприклад,
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
filtered = (k - 1) * filtered + value + carry; carry = filtered % factor; filtered /= factor
повторене зі зміною значень value
. Це робить приємне ціле наближення до фільтра низьких частот першого порядку з постійною часом k
..., але воно є симетричним лише тоді, коли поділ обрізається і carry
отримує негативні значення. Обидва способи поведінки для поділу час від часу корисні.
div
оператор з розділеним флорацією і factor
непарний, то filtered += (filter+(factor div 2)) div factor
він дасть чисту та симетричну поведінку для всіх значень до INT_MAX-(factor div 2)
.
Так, результат завжди скорочується до нуля. Він буде округлювати до найменшого абсолютного значення.
-5 / 2 = -2
5 / 2 = 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, або обидва мають десятковий, отже, коефіцієнт, який ви отримаєте, буде десятковим.