Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 706

/ вопрос решён /

Здравствуйте, уважаемые эксперты!Срочно!надо поделить integer на 2 как это зделать?пишу r:=r/2 (r:integer)-не работает! где в делфи знак деления?

Аксион Вопрос решён, но можно продолжить его обсуждение в мини-форуме

Вопрос задал: Аксион (статус: 4-ый класс)
Вопрос отправлен: 6 июля 2007, 11:31
Состояние вопроса: решён, ответов: 6.

Ответ #1. Отвечает эксперт: Dron

Здравствуйте, ММО!
Знак деления - "/", всё верно. Только вы забыли про то, что при делении числа (и целого и вещественного) получается число вещественное. А присвоить вещественное число целому нельзя (наоборот - можно). Компьютер же не знает, разделится ли число нацело или нет... Поэтому число нужно либо округлить, либо отбросить дробную часть. Например, округлить:
r:=Round(r/2);

Ответ отправил: Dron (статус: Студент)
Время отправки: 6 июля 2007, 11:38
Оценка за ответ: 5

Комментарий к оценке: спасибо всё работает

Ответ #2. Отвечает эксперт: Вадим К

Здравствуйте, ММО!
Да всё работает. Но представте, что r=5. тогда что будет результатом вашей операции деления?
Что бы решить эту проблему, нужно использовать явное приведение.
Для целочисленного деления есть оператор div и mod.
Первый возвращает целую часть от деления, второй - остаток. Например
5 mod 2 = 1
5 div 2 = 2

Можно также округлить, например
Round(5/2) = 2
Round(7/2) = 4
(Округляется по правилу: если дробная часть меньше 0.5, то в меньшую сторону, больше 0.5 - в большую. если равна 0.5 и целая чётна - в меньшую.

Также можно использовать функции Ceil - Округляет к ближайшему целому влево

Ответ отправил: Вадим К (статус: Академик)
Время отправки: 6 июля 2007, 11:42
Оценка за ответ: 5

Комментарий к оценке: спасибо

Ответ #3. Отвечает эксперт: Градов Ю.М.

Здравствуйте, Матвеев Мефодий Олегович!
Можно использовать:
r:=Trunc(r/2);

Ответ отправил: Градов Ю.М. (статус: 8-ой класс)
Время отправки: 6 июля 2007, 14:08
Оценка за ответ: 5

Ответ #4. Отвечает эксперт: Матвеев Игорь Владимирович

Здравствуйте, ММО!
Только оператор деления (/) работает через FPU, целочисленное деление (div) работает за 3 или за 4 (точно не помню) тактов процессора. А самым верным вариантов деления на 2 будет shr 1, т.е. сдвиг битов вправо на один бит, при этом новые биты слева заполняются нулями.
Эта операция равносильна целочисленному делению на 2. Таким образом можно очень быстро делить на степени двойки. Кстати, обратное действие (shl) позволяет целочисленно умножать на степени двойки.

shr - ассемблерная команда, как использовать показано в приложении.

Приложение:
  1. procedure NyamNyam(var Value: Integer);
  2. begin
  3.  
  4. Value := Value + 3;
  5.  
  6. asm
  7.  
  8. shr Value, 1
  9.  
  10. shl Value, 1
  11. end;
  12. end;


Ответ отправил: Матвеев Игорь Владимирович (статус: Студент)
Время отправки: 6 июля 2007, 14:10
Оценка за ответ: 5

Ответ #5. Отвечает эксперт: Новаковский Юрий Аврамович

Здравствуйте, Матвеев Мефодий Олегович!
Если Вам не нужна дробная часть частного,
тогда так:

R:=R div 2;

Удачи!

Ответ отправил: Новаковский Юрий Аврамович (статус: 4-ый класс)
Время отправки: 6 июля 2007, 14:43
Оценка за ответ: 5

Ответ #6. Отвечает эксперт: Дима Гусаков

Здравствуйте, ММО! переменную integer нельзя поделить, так как это целые числа. Пиши r:Real

Ответ отправил: Дима Гусаков (статус: 2-ой класс)
Время отправки: 6 июля 2007, 23:36
Оценка за ответ: 5


Мини-форум вопроса

Всего сообщений: 12; последнее сообщение — 6 июля 2007, 13:18; участников в обсуждении: 3.
Аксион

Аксион (статус: 4-ый класс), 6 июля 2007, 12:54 [#1]:

а вы не знаите как опредилить сколько мб видеокарта?вопрос номер 703
Dron

Dron (статус: Студент), 6 июля 2007, 12:56 [#2]:

Вадим К: Ceil() в модуле Math, т.е. без подключения эта функция найдена не будет. Да и округляет она вправо, а не влево.
С уважением.
Вадим К

Вадим К (статус: Академик), 6 июля 2007, 12:56 [#3]:

А с реестра слабо прочитать?
Галочка "подтверждения прочтения" - вселенское зло.
Dron

Dron (статус: Студент), 6 июля 2007, 12:57 [#4]:

ММО: вы в каком-то вопросе написали, что у вас программа делает то-то, то-то, то-то... Только, по-моему, вы сами ничего не пишете, а собираете её по кусочкам, которые вам дают эксперты...
С уважением.
Вадим К

Вадим К (статус: Академик), 6 июля 2007, 13:01 [#5]:

Да, Ceil вправо, Floor - влево. это я попутал, у меня сейчас сишный компилятор под арм. там только Ceil есть и округляет влево:(

То ММО: А за скоко программу, собирающую инфу о системе продавать будем?
Галочка "подтверждения прочтения" - вселенское зло.
Аксион

Аксион (статус: 4-ый класс), 6 июля 2007, 13:10 [#6]:

и половину то-то-то-то я сделал сам!
Вадим К

Вадим К (статус: Академик), 6 июля 2007, 13:12 [#7]:

ага. кнопочек набросал, картинок натыкал

Главное не забудь цвет формы сделать ярко зелёным или жёлтым - смотреться лучше будет:):):)
Галочка "подтверждения прочтения" - вселенское зло.
Аксион

Аксион (статус: 4-ый класс), 6 июля 2007, 13:13 [#8]:

какие вы злые мне всего 14 лет
Dron

Dron (статус: Студент), 6 июля 2007, 13:14 [#9]:

> с реестра - а в принципе можно
Ну и как? Успешно?

P.S. Может по этой теме лучше в форуме вопроса 703 писать?
С уважением.
Аксион

Аксион (статус: 4-ый класс), 6 июля 2007, 13:14 [#10]:

еще ветвь не нашёл
Вадим К

Вадим К (статус: Академик), 6 июля 2007, 13:17 [#11]:

Почему мы злые? но 14 лет - это ничего не даёт. Это не мешает скачать delphiWorld.narod.ru и не морочить простыми вопросами
Галочка "подтверждения прочтения" - вселенское зло.
Аксион

Аксион (статус: 4-ый класс), 6 июля 2007, 13:18 [#12]:

там про видиокарту 3 строчки

31 января 2011, 19:16: Статус вопроса изменён на решённый (изменил модератор Ерёмин А.А.): Автоматическая обработка (2 и более ответов с оценкой 5)

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:59
Выполнено за 0.03 сек.