Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Получение остатка от деления, механизм... 
:(
    Опции темы
Программер Сpp
  Дата 10.3.2004, 20:37 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











double x;
x=17%3;
cout<<x<<endl;
Выведет на экран 2.

double x;
x=8%5;
cout<<x<<endl;
Выведет на экран 3.

Как компилятор находит остаток от деления?
Если просто, к примеру, разделить 17 на 3 то это - 5,6666666666666666666666666666667
  Вверх
Nastya
Дата 10.3.2004, 20:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 27.3.2002
Где: Мариуполь

Репутация: 5
Всего: 44



int x=17;
while (x>=3) x-=3;


--------------------
Что бы понять рекурсию, надо понять рекурсию

"Профессионал - это человек сделавший все возможные ошибки в очень узкой области". Н.Бор
PM MAIL   Вверх
Nastya
Дата 10.3.2004, 20:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 27.3.2002
Где: Мариуполь

Репутация: 5
Всего: 44



Цитата
double x;
x=8%5;
cout<<x<<endl;
Выведет на экран 3.


Да нет скорее всего єто ошибка на этапе компиляции. Для типа double оператор % не определен


--------------------
Что бы понять рекурсию, надо понять рекурсию

"Профессионал - это человек сделавший все возможные ошибки в очень узкой области". Н.Бор
PM MAIL   Вверх
Программер Сpp
Дата 10.3.2004, 20:58 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Nastya, че-то ты меня запутала...Кто-нить, объясните по-русски...Потому что по Cpp не доходитsmile.gif
  Вверх
bel_nikita
Дата 10.3.2004, 21:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

Репутация: 21
Всего: 47



оператор % - это деление по модулю два
% - возвращает остаток от деления нацело, т.е. double в этом случае не катит


--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
Программер Сpp
Дата 10.3.2004, 21:18 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Но мой компилятор(встроенный в Visual C++.Net) прекрасно обрабатывает код, и выводит результат в консоль.
Вопрос не в том, как че делить...а в самой философии получения остатка. т.е. как??
  Вверх
Borisff2003
Дата 11.3.2004, 06:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 198
Регистрация: 26.2.2004
Где: г. Уфа

Репутация: 1
Всего: 1



в число 17 входит 5 троек, и еще 2 не влазит

17=3*5+2

вот это и есть остаток wink.gif

8=5+3

т.е. это именно остаток, а не дробная часть

Это сообщение отредактировал(а) Borisff2003 - 11.3.2004, 06:28
--------------------
Лень, двигатель прогресса
PM MAIL WWW ICQ   Вверх
Дрон
Дата 11.3.2004, 09:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


Профиль
Группа: Участник Клуба
Сообщений: 3179
Регистрация: 29.12.2002
Где: Санкт-Петербург

Репутация: 10
Всего: 93



Значит, берём и смотрим полученный ассмемблерный код (для Builder 6.0).
Что мы там видим:
Деление реализовано командами процессора idiv (для типа signed) и div (для unsigned), которые представляют собой реализацию знакового и беззнакового деления соответственно. Кроме частного, они также получают остаток.
Цитата
Если делитель размером в двойное слово, то делимое должно быть расположено в паре регистров edx:eax, причем младшая часть делимого находится в eax. После операции частное помещается в eax, а остаток — в edx;
Но это уже детали smile.gif
А что касается аппаратной реализации деления, то про это мне мало что известно.
Сомневаюсь, что это сделано так:
Цитата
int x=17;
while (x>=3) x-=3;

Может быть так, но тоже очень сомнительно:
частное: c = a/b (целочисленное)
остаток: d = a - c*b
Скорее всего там алгоритм, работающий с двоичным представлением smile.gif

Цитата
Для типа double оператор % не определен

Это точно. Только по его коду деление выполняется для целых чисел 8 и 5, а только потом приводится к типу double.

Это сообщение отредактировал(а) Дрон - 11.3.2004, 09:24


--------------------
Да. Именно так.
PM   Вверх
alikzl
Дата 11.3.2004, 11:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 5.3.2004

Репутация: нет
Всего: нет



Не знаю на сколко ета инфа правильная, но w ФАQах есть неболшое описание етоу теми



http://forum.vingrad.ru/index.php?act=ST&f=31&t=17022

Это сообщение отредактировал(а) alikzl - 11.3.2004, 11:39
PM MAIL   Вверх
sergejzr
Дата 12.3.2004, 01:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 19
Всего: 360



Представте себе деление столбиком. Слева делимое справа делитель, а снизу остаток! Получается, что остаток нам дарится при делении всегда.
Процессор делит точно так же, только числа конечно дуальные. В конце имеется два регистра. результат и остаток. В зависимости от оператора( /, % ) возвращается нужный регистр.
Код

323| 31
31 |10  <-(регистр результат )
 13     <-(регистр остаток)  
 


Конечно же это работает только с целыми числами. % для дабл не может быть, так как не может быть остатка при делении десятичных дробей.

Это сообщение отредактировал(а) sergej.z - 19.3.2004, 20:39


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
OlegsDP
Дата 12.3.2004, 11:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 25.2.2004

Репутация: нет
Всего: 1



Мне для выполнения одной работы потребовалось находить остаток от деления на 97 очень длинного десятичного числа, представленного символьной строкой. Вот как это было сделано:

Код

 // char *acc - очень длинное десятичное число,
 // например: "6598723455791251624525862456524523452357"

 int mod = 0; // mod - искомый остаток от деления на 97
 for (int i = 100; acc [i]; i++) {
   mod = (((int)acc [i] - (int)'0') + mod * 10) % 97;
 } /* for */


PM MAIL   Вверх
mr.DUDA
Дата 12.3.2004, 11:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 25
Всего: 232



Цитата
Не знаю на сколко ета инфа правильная, но w ФАQах есть неболшое описание етоу теми

И правильная, и проверенная, можно не сомневаться smile.gif

Цитата
Но мой компилятор(встроенный в Visual C++.Net) прекрасно обрабатывает код, и выводит результат в консоль.

Не-ет, батенька, мы путаем выполнение операции % над double с преобразованием целого значения (8%5) в формат double после выполнения операции % !!! Попробуйте-ка выполнить такое:
Код
    double a = 2.45;
    double b = a % 2;

- и получите ошибку компиляции (в том же VS.NET): "error C2296: '%' : illegal, left operand has type 'double' "

Цитата
Вопрос не в том, как че делить...а в самой философии получения
остатка. т.е. как??

В мат. сопроцессоре реализована команда fprem, вычисляющая остаток от деления по модулю (st(0) % st(1)), в книге "Ассемблер" В.Юрова читаем:
Физически работа команды заключается в реализации хорошо известного всем действия: деления в столбик. При этом каждое промежуточное деление осуществляется отдельной командой fprem. Цикл, центральное место в котором занимает команда fprem, завершается, когда очередная полученная разность в st(0) становится меньше модуля в st(1). Судить об этом можно по состоянию флага c2 в регистре состояния swr.


--------------------
user posted image
PM MAIL WWW   Вверх
Cardholder
  Дата 13.3.2004, 12:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 13.3.2004

Репутация: нет
Всего: нет



Цитата(Borisff2003 @ 11.3.2004, 06:27)
в число 17 входит 5 троек, и еще 2 не влазит

17=3*5+2

вот это и есть остаток wink.gif

8=5+3

т.е. это именно остаток, а не дробная часть

Как же в таком случае компилятор выдает единицу?

#include <iostream>
using namespace std;
void main()
{
int i=1, j=0;
j=1%3;
cout<<j<<endl;
}

PM MAIL   Вверх
mr.DUDA
Дата 13.3.2004, 12:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 25
Всего: 232



Цитата
Как же в таком случае компилятор выдает единицу?

#include <iostream>
using namespace std;
void main()
{
int i=1, j=0;
j=1%3;
cout<<j<<endl;
}


1 = 0*3 + 1

где жирная единица - остаток, 0 - частное, 1 слева - делимое, 3 - делитель


--------------------
user posted image
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1379 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.