Определить четность/нечетность числа.

Тема в разделе "WASM.ZEN", создана пользователем _Juicy, 27 янв 2011.

  1. _Juicy

    _Juicy Active Member

    Публикаций:
    0
    Регистрация:
    12 авг 2003
    Сообщения:
    1.159
    Адрес:
    SPb
    Как определить четность числа типа real (т.е., нецелочисленный тип), без приведения к целому типу и использования остатка целочисленного деления?

    PS: или как из типа real получить тип integer, не пользуясь функцией trunc(). Есть тут знатоки паскаля?
     
  2. Black_mirror

    Black_mirror Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2002
    Сообщения:
    1.035
    Squash
    А что вы хотите делать с дробными числами?
     
  3. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    Как можно определить чётность нецелого числа?
     
  4. _Juicy

    _Juicy Active Member

    Публикаций:
    0
    Регистрация:
    12 авг 2003
    Сообщения:
    1.159
    Адрес:
    SPb
    Использовать в качестве показателя степени. Вообще говоря, смысла в этом никакого, просто у младшего братца преподаватель чудит. Кажется, взятку хочет, но пока мы идем на принцип.
     
  5. _Juicy

    _Juicy Active Member

    Публикаций:
    0
    Регистрация:
    12 авг 2003
    Сообщения:
    1.159
    Адрес:
    SPb
    После точки - нули, т.е. оно целое, но целочисленное деление к нему не применить.
     
  6. rat4

    rat4 Member

    Публикаций:
    0
    Регистрация:
    13 сен 2005
    Сообщения:
    30
    Код (Text):
    1. #include <stdio.h>
    2. #include <math.h>
    3.  
    4. int main()
    5. {
    6. double i = 7;
    7. i = fabs( i/2 );
    8. while ( --i > 0 );
    9. printf("\n %f \n",i);
    10. if ( i == 0 )
    11. printf ("1\n");
    12. else if ( i == -0.5 )
    13. printf ("2\n");
    14. else
    15. printf ("3\n");
    16. }
    Сойдёт? :)
     
  7. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    Не буду утверждать, что это неверно в общем случае.

    Нельзя делить - умножьте на 0,5 и сравните дробную часть по модулю с eps = 0,00...1.
     
  8. _Juicy

    _Juicy Active Member

    Публикаций:
    0
    Регистрация:
    12 авг 2003
    Сообщения:
    1.159
    Адрес:
    SPb
    rat4

    Гениально. Спасибо!
     
  9. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Squash
    Вообще достаточно проверить один бит. Какой, надеюсь сами вычислите.
     
  10. _Juicy

    _Juicy Active Member

    Публикаций:
    0
    Регистрация:
    12 авг 2003
    Сообщения:
    1.159
    Адрес:
    SPb
    Паскаль, первый курс... Препода удар может хватить.
     
  11. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.914
    Squash
    Тему в HEAP или в BEGINNERS WASM.ZEN совсем не для этого, ТС нужно было хотя бы пару тем почитать в этой ветке прежде, чем создавать сообщение
     
  12. _Juicy

    _Juicy Active Member

    Публикаций:
    0
    Регистрация:
    12 авг 2003
    Сообщения:
    1.159
    Адрес:
    SPb
  13. _sheva740

    _sheva740 New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    1.539
    Адрес:
    Poland
    Squash
    Если предмет профилирующий, то лучше платить.
    Все равно на последующих курсах с этим преподом еще не раз встретишься :dntknw:

    Вообще в таких ситуациях нужно спрашивать так:
    "Как себя вести на лентах чтобы пофиг было четное число или нет?" )))
     
  14. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Booster
    Если намёк на двоичное представление double, то недостаточно. Надо найти номер последнего значащего бита мантиссы (начиная с неявной единицы на условно нулевой позиции) и проверить, не превышает ли он разность между значением в поле порядка и базой (1023 для double). Если разность больше, то число чётное. Нуль надо вообще обрабатывать особым образом. В общем случае учитывать надо все биты представления.
     
  15. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.625
    Адрес:
    Russia
    Squash
    ну если это только проблема найти еще какую-нить функцию пасквиля, то справочник по пасквилю поможет вам быстрее чем форум по низкоуровневому проганью

    понятие четность для не целых чисел не определено, более того для больших чисел как например число Авогадро 6.02 * 10^23 или скорость света в ангстремах в секунду последние знаки представляют весьма малый интерес
     
  16. Black_mirror

    Black_mirror Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2002
    Сообщения:
    1.035
    Squash
    Можно проверить так
    if Fraq(x/2.0)<0.5 then чётное
     
  17. _Juicy

    _Juicy Active Member

    Публикаций:
    0
    Регистрация:
    12 авг 2003
    Сообщения:
    1.159
    Адрес:
    SPb
    Black_mirror
    Наверное, Frac?
    Если преподавателя не устроил Trunc, то вряд ли есть смысл подсовывать ему аналоги.
     
  18. Black_mirror

    Black_mirror Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2002
    Сообщения:
    1.035
    Для чисел типа double больших чем единица бит соответствующий единице можно проверить так:
    double x1=x+1;
    int64 m=(*(int64*)&x1)^(*(int64*)&x);
    if(m&(m-1)==0)
    чётное;
    else
    нет;
     
  19. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Black_mirror
    Уверены, что будет работать для чисел больших 2^53? :)
     
  20. Black_mirror

    Black_mirror Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2002
    Сообщения:
    1.035
    l_inc
    Для них x+1==x, значит m==0 и m&(m-1)==0.