![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
Программер Сpp |
|
|||
Unregistered |
double x;
x=17%3; cout<<x<<endl; Выведет на экран 2. double x; x=8%5; cout<<x<<endl; Выведет на экран 3. Как компилятор находит остаток от деления? Если просто, к примеру, разделить 17 на 3 то это - 5,6666666666666666666666666666667 |
|||
|
||||
Nastya |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 27.3.2002 Где: Мариуполь Репутация: 5 Всего: 44 |
int x=17;
while (x>=3) x-=3; -------------------- Что бы понять рекурсию, надо понять рекурсию "Профессионал - это человек сделавший все возможные ошибки в очень узкой области". Н.Бор |
|||
|
||||
Nastya |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 27.3.2002 Где: Мариуполь Репутация: 5 Всего: 44 |
Да нет скорее всего єто ошибка на этапе компиляции. Для типа double оператор % не определен -------------------- Что бы понять рекурсию, надо понять рекурсию "Профессионал - это человек сделавший все возможные ошибки в очень узкой области". Н.Бор |
|||
|
||||
Программер Сpp |
|
|||
Unregistered |
Nastya, че-то ты меня запутала...Кто-нить, объясните по-русски...Потому что по Cpp не доходит
![]() |
|||
|
||||
bel_nikita |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Эксперт Сообщений: 2304 Регистрация: 12.10.2003 Где: Поезд №21/22 ( ст . Прага ) Репутация: 21 Всего: 47 |
оператор % - это деление по модулю два
% - возвращает остаток от деления нацело, т.е. double в этом случае не катит |
|||
|
||||
Программер Сpp |
|
|||
Unregistered |
Но мой компилятор(встроенный в Visual C++.Net) прекрасно обрабатывает код, и выводит результат в консоль.
Вопрос не в том, как че делить...а в самой философии получения остатка. т.е. как?? |
|||
|
||||
Borisff2003 |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 198 Регистрация: 26.2.2004 Где: г. Уфа Репутация: 1 Всего: 1 |
в число 17 входит 5 троек, и еще 2 не влазит
17=3*5+2 вот это и есть остаток ![]() 8=5+3 т.е. это именно остаток, а не дробная часть Это сообщение отредактировал(а) Borisff2003 - 11.3.2004, 06:28 --------------------
Лень, двигатель прогресса |
|||
|
||||
Дрон |
|
||||||
![]() Java-ненавистник :) ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3179 Регистрация: 29.12.2002 Где: Санкт-Петербург Репутация: 10 Всего: 93 |
Значит, берём и смотрим полученный ассмемблерный код (для Builder 6.0).
Что мы там видим: Деление реализовано командами процессора idiv (для типа signed) и div (для unsigned), которые представляют собой реализацию знакового и беззнакового деления соответственно. Кроме частного, они также получают остаток.
![]() А что касается аппаратной реализации деления, то про это мне мало что известно. Сомневаюсь, что это сделано так:
Может быть так, но тоже очень сомнительно: частное: c = a/b (целочисленное) остаток: d = a - c*b Скорее всего там алгоритм, работающий с двоичным представлением ![]()
Это точно. Только по его коду деление выполняется для целых чисел 8 и 5, а только потом приводится к типу double. Это сообщение отредактировал(а) Дрон - 11.3.2004, 09:24 -------------------- Да. Именно так. |
||||||
|
|||||||
alikzl |
|
|||
Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 5.3.2004 Репутация: нет Всего: нет |
Не знаю на сколко ета инфа правильная, но w ФАQах есть неболшое описание етоу теми
http://forum.vingrad.ru/index.php?act=ST&f=31&t=17022 Это сообщение отредактировал(а) alikzl - 11.3.2004, 11:39 |
|||
|
||||
sergejzr |
|
|||
![]() Un salsero ![]() Профиль Группа: Админ Сообщений: 13285 Регистрация: 10.2.2004 Где: Германия г .Ганновер Репутация: 19 Всего: 360 |
Представте себе деление столбиком. Слева делимое справа делитель, а снизу остаток! Получается, что остаток нам дарится при делении всегда.
Процессор делит точно так же, только числа конечно дуальные. В конце имеется два регистра. результат и остаток. В зависимости от оператора( /, % ) возвращается нужный регистр.
Конечно же это работает только с целыми числами. % для дабл не может быть, так как не может быть остатка при делении десятичных дробей. Это сообщение отредактировал(а) sergej.z - 19.3.2004, 20:39 |
|||
|
||||
OlegsDP |
|
|||
Новичок Профиль Группа: Участник Сообщений: 37 Регистрация: 25.2.2004 Репутация: нет Всего: 1 |
Мне для выполнения одной работы потребовалось находить остаток от деления на 97 очень длинного десятичного числа, представленного символьной строкой. Вот как это было сделано:
|
|||
|
||||
mr.DUDA |
|
||||||||
![]() 3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 25 Всего: 232 |
И правильная, и проверенная, можно не сомневаться ![]()
Не-ет, батенька, мы путаем выполнение операции % над double с преобразованием целого значения (8%5) в формат double после выполнения операции % !!! Попробуйте-ка выполнить такое:
- и получите ошибку компиляции (в том же VS.NET): "error C2296: '%' : illegal, left operand has type 'double' "
В мат. сопроцессоре реализована команда fprem, вычисляющая остаток от деления по модулю (st(0) % st(1)), в книге "Ассемблер" В.Юрова читаем: Физически работа команды заключается в реализации хорошо известного всем действия: деления в столбик. При этом каждое промежуточное деление осуществляется отдельной командой fprem. Цикл, центральное место в котором занимает команда fprem, завершается, когда очередная полученная разность в st(0) становится меньше модуля в st(1). Судить об этом можно по состоянию флага c2 в регистре состояния swr. -------------------- ![]() |
||||||||
|
|||||||||
Cardholder |
|
|||
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 13.3.2004 Репутация: нет Всего: нет |
Как же в таком случае компилятор выдает единицу? #include <iostream> using namespace std; void main() { int i=1, j=0; j=1%3; cout<<j<<endl; } |
|||
|
||||
mr.DUDA |
|
|||
![]() 3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 25 Всего: 232 |
1 = 0*3 + 1 где жирная единица - остаток, 0 - частное, 1 слева - делимое, 3 - делитель -------------------- ![]() |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |