свойства целочисленного деления
выполняется ли следующее целочисленное арифметическое свойство?
(m/n)/l == m/(n*l)
сначала я думал, что знаю ответ (не держит), но теперь не уверен.
Выполняется ли это для всех чисел или только для определенных условий, т. е. n > l
?
вопрос относится к компьютерной арифметики, а именно q = n/m, q*m != n
, игнорируя переполнение.
2 ответов
Case1 assume m = kn+b (b<n),
left = (m/n)/l = ((kn+b)/n)/l = (k+b/n)/l = k/l (b/n=0, because b<n)
right = (kn+b)/(n*l) = k/l + b/(n*l) = k/l (b/(n*l)=0, because b<n)
=> left = right
Case2 assume m = kn,
left = (m/n)/l = (kn/n)/l = k/l
right = kn/(n*l) = k/l
=> left = right
So, (m/n)/l == m/(n*l)
вы говорите о математических числах? Или целые числа фиксированной ширины в языке программирования?
два уравнения идентичны математическим целым числам, но две функции имеют разное поведение переполнения, если вы используете целые числа фиксированной ширины.
например, предположим, что целые числа 32-битные
(1310720000/65536)/65537 = 20000/65537 = 0
однако 65536 * 65537 переполнит 32-разрядное целое число и будет равно 65536, поэтому
1310720000/(65536*65537) = 1310720000/65536 = 20000