Модераторы: 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   Вверх
Sleepless
Дата 28.3.2008, 11:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Earnest @  27.3.2008,  19:08 Найти цитируемый пост)
Хотя, конечно, нынче компиляторы из  i%2 делают то же самое...

ИМХО, идеальный компилятор должен привести оба варианта к сдвигу вправо и анализу полученного бита... Кстати, VS 2005 для двух вариантов сгенерирует разный код, причем сдвига не будет ни в одном из них.
PM   Вверх
bsa
Дата 28.3.2008, 13:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Sleepless @ 28.3.2008,  11:25)
ИМХО, идеальный компилятор должен привести оба варианта к сдвигу вправо и анализу полученного бита...

Это откуда такая уверенность? Ты думаешь, скорость выполнения сдвига выше, чем у операции AND?
PM   Вверх
Sleepless
Дата 28.3.2008, 14:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(bsa @  28.3.2008,  13:57 Найти цитируемый пост)
Это откуда такая уверенность?

100% уверенности нет, т.к. обе операции регистровые. Только "И" требует 2 операнда... Ладно, пороюсь на досуге в Интеловской локументации
PM   Вверх
baldina
Дата 28.3.2008, 14:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Sleepless, был удивлен, проверил. Все-таки оно одинаковый код генерит...
PM MAIL   Вверх
Sleepless
Дата 28.3.2008, 14:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(baldina @  28.3.2008,  14:19 Найти цитируемый пост)
Sleepless, был удивлен, проверил. Все-таки оно одинаковый код генерит... 

Ты про VS2005? Приведи С++ код, листинг и укажи настройки компилятора - сравню с моими
PM   Вверх
baldina
Дата 28.3.2008, 14:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Если честно, на 2005 не проверял. Проверял на 2003 и 2008. Они генерят абсолютно одинаковый код. Потому думаю, что и 2005 не выделяется.
Код

  std::cout << (abc%2) << std::endl;
mov         eax,dword ptr [__imp_std::endl (40200Ch)] 
mov         ecx,dword ptr [abc (403018h)] 
and         ecx,1 
push        eax  
push        ecx  
mov         ecx,dword ptr [__imp_std::cout (402008h)] 
call        dword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (402010h)] 
mov         ecx,eax 
call        dword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (402014h)] 
  std::cout << (abc&1) << std::endl;
mov         edx,dword ptr [__imp_std::endl (40200Ch)] 
mov         eax,dword ptr [abc (403018h)] 
mov         ecx,dword ptr [__imp_std::cout (402008h)] 
push        edx  
and         eax,1 
push        eax  
call        dword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (402010h)] 
mov         ecx,eax 
call        dword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (402014h)] 


Добавлено через 3 минуты и 40 секунд
unsigned abc;

если тип знаковый, код, понятно, будет разным...
PM MAIL   Вверх
Sleepless
Дата 28.3.2008, 14:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Sleepless @  28.3.2008,  11:25 Найти цитируемый пост)
Кстати, VS 2005 для двух вариантов сгенерирует разный код, причем сдвига не будет ни в одном из них. 

Цитата(baldina @  28.3.2008,  14:29 Найти цитируемый пост)
Они генерят абсолютно одинаковый код

Хм... Ты прав... Я ошибся :( Интересно, куда я смотрел? 

Может кто-нибудь привести код, сгенерированный не MS-компилятором?
PM   Вверх
korian
Дата 28.3.2008, 14:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Sleepless @  28.3.2008,  13:54 Найти цитируемый пост)
Хм... Ты прав... Я ошибся :( Интересно, куда я смотрел? 

я вообще не понимаю о чем тут спорить...
тогда уж надо проверить все компиляторы, причем на каждом проверить все платформы (x86, x486... Core2Duo, потом AMD т.д.) и после этого можно будет только составить статистику, какой код генерится чаще.

PM   Вверх
Любитель
Дата 30.3.2008, 00:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

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



Я за энд smile


--------------------
PM MAIL ICQ Skype   Вверх
Mayk
Дата 30.3.2008, 10:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


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

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



Цитата(Sleepless @  28.3.2008,  18:54 Найти цитируемый пост)

Может кто-нибудь привести код, сгенерированный не MS-компилятором? 

Код

int imod2( int x ){
    return x  % 2;
}

int umod2( unsigned x ){
    return x  % 2;
}


gcc (GCC) 4.1.3 20070929 (prerelease) (Ubuntu 4.1.2-16ubuntu2):
Код

imod2:
.LFB2:
    movl    %edi, %edx
    shrl    $31, %edx
    leal    (%rdi,%rdx), %eax
    andl    $1, %eax
    subl    %edx, %eax
    ret
.LFE2:
    .size    imod2, .-imod2
    .p2align 4,,15
.globl umod2
    .type    umod2, @function
umod2:
.LFB3:
    andl    $1, %edi
    movl    %edi, %eax
    ret



q3lcc. версию умалчивает. как он связан с ку3 не помню.
Код

imod2:
pushl %ebp
pushl %ebx
pushl %esi
pushl %edi
movl %esp,%ebp
movl 20(%ebp),%eax
movl $2,%ecx
cdq
idivl %ecx
movl %edx,%eax
.LC1:
movl %ebp,%esp
popl %edi
popl %esi
popl %ebx
popl %ebp
ret
.Lf2:
.size imod2,.Lf2-imod2
.globl umod2
.align 16
.type umod2,@function
umod2:
pushl %ebp
pushl %ebx
pushl %esi
pushl %edi
movl %esp,%ebp
movl 20(%ebp),%edi
andl $1,%edi
movl %edi,%eax
.LC3:
movl %ebp,%esp
popl %edi
popl %esi
popl %ebx
popl %ebp
ret


tcc: Information: Version: 4.0, Machine: linux-*-80x86, Release: TenDRA-4.1.2.
Код

imod2:
.set .Ldisp0, 0           
 movl 4+.Ldisp0(%esp),%eax
 andl $1,%eax
 ret
.align 4
.size imod2, .-imod2
.text
.type umod2,@function
.globl umod2
.align 16
umod2:
.set .Ldisp2, 0           
 movl 4+.Ldisp2(%esp),%eax
 andl $1,%eax
 ret


искать другие компиляторы в лом.


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
Любитель
Дата 30.3.2008, 10:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

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



Код
movl 4+.Ldisp0(%esp),%eax andl $1,%eax

и
Код
movl 4+.Ldisp0(%esp),%eax andl $1,%eax

хде отличие? smile 




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


Эксперт
****


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

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



ICC:
Код
umod2:
# parameter 1: %edi
..B1.1:                         # Preds ..B1.0
..___tag_value_umod2.1:                                         #5.24
        andl      $1, %edi                                      #6.14
        movl      %edi, %eax                                    #6.14
        ret                                                     #6.14
#........
imod2:
# parameter 1: %edi
..B2.1:                         # Preds ..B2.0
..___tag_value_imod2.9:                                         #1.19
        movl      %edi, %eax                                    #2.14
        andl      $-2147483647, %eax                            #2.14
        jge       ..B2.4        # Prob 50%                      #2.14
                                # LOE rbx rbp r12 r13 r14 r15 eax
..B2.5:                         # Preds ..B2.1
        decl      %eax                                          #2.14
        orl       $-2, %eax                                     #2.14
        incl      %eax                                          #2.14
                                # LOE rbx rbp r12 r13 r14 r15 eax
..B2.4:                         # Preds ..B2.1 ..B2.5
        ret                                                     #2.14

PM   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

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

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

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

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


 




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


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

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