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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Целочисленные типы в выражениях, Этот славный С++! 
:(
    Опции темы
S.A.G.
Дата 27.3.2008, 09:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


не эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1339
Регистрация: 20.7.2006
Где: in ad equate

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



Значит так, имеем код, он ВЫПОЛНЯЕТ нужную задачу - начиная с 13 по 19 место заполняет массив числом 10000.0..:
Код

        for (i = 13; i < 20; i++)
        {
            int j = ceil((float)(i / 2));
                if (((float)i / 2) == j)
                    continue;
            WholeFuncCoeff[i] = 10000;
        }

Но почему вот такой код НЕ приносит желаемый результат:
Код

        for (i = 13; i < 20; i++)
        {
            int j = ceil((float)(i / 2));
                if ((/*(float)*/i / 2) == j)
                    continue;
            WholeFuncCoeff[i] = 10000;
        }

Или может следует даже вот так записать, чтобы сравнивать плавающие типы с одинаковой точностью(?):
Код

        for (i = 13; i < 20; i++)
        {
            float j = ceil((float)(i / 2));
                if (((float)i / 2) == j)
                    continue;
            WholeFuncCoeff[i] = 10000;
        }

Я всегда знал, что если:
Код

int i = 5;
i = i / 2;

, то i будет равно 2. Но если имеем выражение (i / 2), разве оно не должно быть типа double = 2.5 по стандарту??? А то пришлось явно приводить i к float перед делением!

Это сообщение отредактировал(а) S.A.G. - 27.3.2008, 09:41


--------------------
Вот она задачка: спасти себя от себя самого © Cube
Sometimes good people do evil things © A Simple Plan
PM   Вверх
korian
Дата 27.3.2008, 09:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 651
Регистрация: 8.3.2008
Где: Украина, Харьков

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



если целое делиться на целое - результат целое
решение: надо один из типов перевести в float
Код

        for (i = 13; i < 20; i++)
        {
            int j = ceil(i / 2.); //или (i / 2.f)
                if ((i / 2.) == j)
                    continue;
            WholeFuncCoeff[i] = 10000;
        }



Это сообщение отредактировал(а) korian - 27.3.2008, 09:50
PM   Вверх
S.A.G.
Дата 27.3.2008, 09:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


не эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1339
Регистрация: 20.7.2006
Где: in ad equate

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



Цитата(korian @  27.3.2008,  09:49 Найти цитируемый пост)
если целое делиться на целое - результат целое

Я думал, что это проявляется только при присвоении переменной целого типа значения типа не целого. Но в выражениях!..

Добавлено через 10 минут и 2 секунды
Но тогда можно не заморачиваться и просто записать проверку на парность:
Код

if ((double)(i / 2) == (i / 2.))
    continue;

Тут double сравнивается с double? Числовые плавающие константы в С, я знаю, имеют тип double, а в С++ тоже так?


--------------------
Вот она задачка: спасти себя от себя самого © Cube
Sometimes good people do evil things © A Simple Plan
PM   Вверх
mes
Дата 27.3.2008, 11:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(S.A.G. @  27.3.2008,  09:55 Найти цитируемый пост)
((double)(i / 2) == 


если нужен дробный тип дели так  (i/2.0)


--------------------
PM MAIL WWW   Вверх
Earnest
Дата 27.3.2008, 11:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Что-то я не пойму - это ты так четность проверяешь?


--------------------
...
PM   Вверх
S.A.G.
Дата 27.3.2008, 12:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


не эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1339
Регистрация: 20.7.2006
Где: in ad equate

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



Вот этим(?):
Код

if ((double)(i / 2) == (i / 2.))
    continue;

Ну да.

Добавлено через 32 секунды
Цитата(S.A.G. @  27.3.2008,  09:55 Найти цитируемый пост)
Тут double сравнивается с double?

?


--------------------
Вот она задачка: спасти себя от себя самого © Cube
Sometimes good people do evil things © A Simple Plan
PM   Вверх
Sleepless
Дата 27.3.2008, 12:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Earnest @  27.3.2008,  11:35 Найти цитируемый пост)
Что-то я не пойму - это ты так четность проверяешь? 


Цитата(S.A.G. @  27.3.2008,  12:20 Найти цитируемый пост)
Ну да.

http://forum.vingrad.ru/forum/topic-202920.html
PM   Вверх
inside_pointer
Дата 27.3.2008, 13:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата("S.A.G.")

Но если имеем выражение (i / 2), разве оно не должно быть типа double = 2.5 по стандарту??? А то пришлось явно приводить i к float перед делением!

Чтобы i само привелось к double надо поставить 2.0, результат тоже будет double, и j даже если оно целое, в операции сравнения с этим результатом тоже должно преобразоваться в double.
А при делении i / 2 если i целое, то 2 к double не приводится, и результат соответственно тоже не получается как double, а идёт как int, у которого нет дробной части.
PM MAIL   Вверх
S.A.G.
Дата 27.3.2008, 17:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


не эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1339
Регистрация: 20.7.2006
Где: in ad equate

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



Sleepless, мой метод тоже подходит. smile


--------------------
Вот она задачка: спасти себя от себя самого © Cube
Sometimes good people do evil things © A Simple Plan
PM   Вверх
vinter
Дата 27.3.2008, 17:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

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



Цитата(S.A.G. @  27.3.2008,  18:12 Найти цитируемый пост)
Sleepless, мой метод тоже подходит

угу, только если так писать то в конце концов разгневанный человек ,смотрящий твой код, придет к тебе ночью с холодным оружием..


--------------------
Мой блог
PM MAIL WWW   Вверх
Sleepless
Дата 27.3.2008, 17:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(S.A.G. @  27.3.2008,  17:12 Найти цитируемый пост)
Sleepless, мой метод тоже подходит

В общем случае, Ваш метод может не работать из-за ограниченной точности представления вещественных чисел.
PM   Вверх
S.A.G.
Дата 27.3.2008, 17:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


не эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1339
Регистрация: 20.7.2006
Где: in ad equate

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



Sleepless, ага, может не совпасть на 0.00000001 или около того. Вобщем, забыл я такой простой оператор - целочисленное деление. smile


--------------------
Вот она задачка: спасти себя от себя самого © Cube
Sometimes good people do evil things © A Simple Plan
PM   Вверх
Earnest
Дата 27.3.2008, 19:08 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(S.A.G. @  27.3.2008,  18:12 Найти цитируемый пост)
Sleepless, мой метод тоже подходит.

Да, для шифрования кода. smile 
S.A.G., настоящие C-программеры проверяют четность так: i&1
 smile 
Хотя, конечно, нынче компиляторы из  i%2 делают то же самое...


--------------------
...
PM   Вверх
S.A.G.
Дата 27.3.2008, 19:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


не эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1339
Регистрация: 20.7.2006
Где: in ad equate

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



Earnest, i&1?


--------------------
Вот она задачка: спасти себя от себя самого © Cube
Sometimes good people do evil things © A Simple Plan
PM   Вверх
baldina
Дата 27.3.2008, 20:08 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

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



S.A.G., i&1 - проверка младшего бита. вспомни, что числа у нас в двоичной системе, каждый разряд кратен степени двойки. потому вот...
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.0954 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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