forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   C++ (http://forum.boolean.name/forumdisplay.php?f=22)
-   -   Проверка на четность (http://forum.boolean.name/showthread.php?t=14897)

Hagrael 15.06.2011 16:27

Проверка на четность
 
Я составил такую программу, проверяющую число на четность:
Код:

#include <iostream>

using namespace std;

int main() {
    int number;
    double half;

    cout << "Welcome to a program, with help of which"
            << "you will know, if your number is odd?" << endl;
    cout << "Please, input the number and press ENTER: ";
        cin >> number;
        half=number/2;
        cout << half << endl;
        if (half==static_cast<int>(half)) {
                cout << "Yes! Your number is even!";
        } else {
                cout << "No, your number isn't even.";
        }

    return 0;
}

Но почему-то half=5 при number=11, хотя переменная half относится к типу double. Когда я присваиваю тип double и к переменной number, то все нормализуется - half=5.5.

Знаю, что алгоритм не очень хороший, и что его решить можно при помощи рассмотрения остатка от деления числа на 2, но все же, почему некорректно работает этот код?

impersonalis 15.06.2011 16:33

Ответ: Проверка на четность
 
half=number/2.0;
//хоть ты и упомянул про нелучшее решение, но: для проверки на чётность надо проверять младший бит

Hagrael 15.06.2011 16:55

Ответ: Проверка на четность
 
Значит, при делении integer на integer не может получиться double? Но тогда как быть в такой ситуации:
У меня есть переменная int a и int b. Они содержат какие-то числа, мне не известные. Надо узнать точный результат деления. В этом случае с помощью оператора static_cast преобразовывать a или b?

Цитата:

для проверки на чётность надо проверять младший бит
Ух ты, интересный способ!

impersonalis 15.06.2011 17:08

Ответ: Проверка на четность
 
Цитата:

У меня есть переменная int a и int b. Они содержат какие-то числа, мне не известные. Надо узнать точный результат деления.
double R=a/double(b);

Hagrael 15.06.2011 17:24

Ответ: Проверка на четность
 
Спасибо, понял.
Правда пока не до конца понятно, почему разработчики языка сделали этот нюанс.

impersonalis 16.06.2011 10:21

Ответ: Проверка на четность
 
Цитата:

Сообщение от Hagrael (Сообщение 191609)
Правда пока не до конца понятно, почему разработчики языка сделали этот нюанс.

В Блитце аналогично.

HolyDel 16.06.2011 10:51

Ответ: Проверка на четность
 
Цитата:

Сообщение от impersonalis (Сообщение 191605)
для проверки на чётность надо проверять младший бит

всегда считал что компилятор и сам справится с етой задачей, но отнюдь ((

Код:

; 13  :        if(i%2)

        mov        edx, DWORD PTR _i$[esp+8]
        and        edx, -2147483647                        ; 80000001H
        jns        SHORT $LN5@wmain
        dec        edx
        or        edx, -2                                        ; fffffffeH
        inc        edx
$LN5@wmain:
        je        SHORT $LN2@wmain

; 13  :        if(i & 0x00000001)

        test        BYTE PTR _i$[esp+8], 1
        je        SHORT $LN2@wmain

как видим - результат с проверкой младшего бита намного короче.

Hagrael 16.06.2011 10:57

Ответ: Проверка на четность
 
HolyDel, спасибо, но я до такого еще не дорос :)

Reks888 20.06.2011 17:20

Ответ: Проверка на четность
 
Цитата:

Сообщение от HolyDel (Сообщение 191727)
Код:

; 13  :        if(i%2)

        mov        edx, DWORD PTR _i$[esp+8]
        and        edx, -2147483647                        ; 80000001H
        jns        SHORT $LN5@wmain
        dec        edx
        or        edx, -2                                        ; fffffffeH
        inc        edx
$LN5@wmain:
        je        SHORT $LN2@wmain

; 13  :        if(i & 0x00000001)

        test        BYTE PTR _i$[esp+8], 1
        je        SHORT $LN2@wmain


Так вот какой ты, odd

impersonalis 20.06.2011 17:40

Ответ: Проверка на четность
 
кстати, результат компиляции на чём (компилятор) был препарирован?

HolyDel 20.06.2011 23:49

Ответ: Проверка на четность
 
cl.exe

falcon 21.06.2011 00:46

Ответ: Проверка на четность
 
>>double R=a/double(b);
нииспользовать приведения в C-style!!

Код:

int b = 5;
main()
{
  int(b); //вроде бы просто приведение с игнорированием возвращаемого значения
  cout<<b<<endl;
}

неоднозначности ёпта
(ну ессно в арифметических выражениях нельзя доходить до маразма, но просто в памяти после приведённого примера, сломавшего мозг в своё время, всплывает отвращение к такому виду синтаксиса)


Часовой пояс GMT +4, время: 07:46.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot