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

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

  1. _Juicy

    _Juicy Active Member

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

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

    Black_mirror Active Member

    Публикаций:
    0
    Squash
    А что вы хотите делать с дробными числами?
     
  3. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Как можно определить чётность нецелого числа?
     
  4. _Juicy

    _Juicy Active Member

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

    _Juicy Active Member

    Публикаций:
    0
    После точки - нули, т.е. оно целое, но целочисленное деление к нему не применить.
     
  6. rat4

    rat4 Member

    Публикаций:
    0
    Код (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
    Не буду утверждать, что это неверно в общем случае.

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

    _Juicy Active Member

    Публикаций:
    0
    rat4

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

    Booster New Member

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

    _Juicy Active Member

    Публикаций:
    0
    Паскаль, первый курс... Препода удар может хватить.
     
  11. Mikl___

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

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

    _Juicy Active Member

    Публикаций:
    0
  13. _sheva740

    _sheva740 New Member

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

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

    l_inc New Member

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

    Rockphorr Well-Known Member

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

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

    Black_mirror Active Member

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

    _Juicy Active Member

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

    Black_mirror Active Member

    Публикаций:
    0
    Для чисел типа 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
    Black_mirror
    Уверены, что будет работать для чисел больших 2^53? :)
     
  20. Black_mirror

    Black_mirror Active Member

    Публикаций:
    0
    l_inc
    Для них x+1==x, значит m==0 и m&(m-1)==0.