#1 27-01-2011 13:25:06

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

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

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

Отредактировано Squash (27-01-2011 13:51:05)

Вне форума

#2 27-01-2011 13:37:52

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

Squash
А что вы хотите делать с дробными числами?

Вне форума

#3 27-01-2011 13:41:39

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

четность числа типа real (т.е., нецелочисленный тип)

Как можно определить чётность нецелого числа?

Вне форума

#4 27-01-2011 13:41:53

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

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

Вне форума

#5 27-01-2011 13:42:50

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

Как можно определить чётность нецелого числа?

После точки - нули, т.е. оно целое, но целочисленное деление к нему не применить.

Вне форума

#6 27-01-2011 13:51:25

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

#include <stdio.h>
#include <math.h>

int main()
{
double i = 7;
i = fabs( i/2 );
while ( --i > 0 );
printf("\n %f \n",i);
if ( i == 0 )
printf ("1\n");
else if ( i == -0.5 )
printf ("2\n");
else
printf ("3\n");
}

Сойдёт? :)

Вне форума

#7 27-01-2011 13:53:47

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

После точки - нули, т.е. оно целое, но целочисленное деление к нему не применить.

Не буду утверждать, что это неверно в общем случае.

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

Вне форума

#8 27-01-2011 13:56:10

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

rat4

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

Отредактировано Squash (27-01-2011 14:01:04)

Вне форума

#9 27-01-2011 13:57:04

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

Squash
Вообще достаточно проверить один бит. Какой, надеюсь сами вычислите.

Вне форума

#10 27-01-2011 14:00:34

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

Вообще достаточно проверить один бит. Какой, надеюсь сами вычислите.

Паскаль, первый курс... Препода удар может хватить.

Вне форума

#11 27-01-2011 14:11:15

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

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

Вне форума

#12 27-01-2011 14:17:17

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

Mikl___
Я считаю, что вы неправы.
И топики, подобные этому, в ветке есть. Хотя бы http://www.wasm.ru/forum/viewtopic.php?id=39270

Отредактировано Squash (27-01-2011 14:17:42)

Вне форума

#13 27-01-2011 14:19:14

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

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

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

Отредактировано _sheva740 (27-01-2011 14:21:26)

На форуме

#14 27-01-2011 14:34:17

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

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

Отредактировано l_inc (27-01-2011 14:37:10)


No love, no mercy — no pain.

Вне форума

#15 27-01-2011 14:49:03

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

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

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


Беспощадный тролль в дзене
CONTRA VERBOSOS NOLI CONTENDERE VERBIS: SERMO DATUR CUNCTIS, ANIMI SAPIENTIA PAUCIS

Вне форума

#16 27-01-2011 15:00:29

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

Squash
Можно проверить так
if Fraq(x/2.0)<0.5 then чётное

Вне форума

#17 27-01-2011 15:06:56

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

Black_mirror
Наверное, Frac?
Если преподавателя не устроил Trunc, то вряд ли есть смысл подсовывать ему аналоги.

Вне форума

#18 27-01-2011 15:22:48

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

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

Вне форума

#19 27-01-2011 16:08:54

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

Black_mirror
Уверены, что будет работать для чисел больших 2^53? :-)


No love, no mercy — no pain.

Вне форума

#20 27-01-2011 16:19:27

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

l_inc
Для них x+1==x, значит m==0 и m&(m-1)==0.

Вне форума

#21 27-01-2011 16:36:09

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

Black_mirror

Для них x+1==x

Да вот не для всех, похоже. Моя студия по крайней мере показывает следующее:

unsigned long long i = 0x20000000000002;
double a = i;
double b = a + 1;
printf("%f %f", a, b);

На выходе:
9007199254740994.000000 9007199254740996.000000


No love, no mercy — no pain.

Вне форума

#22 27-01-2011 17:41:47

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

l_inc
Значит придётся шаманить с округлением.

Вне форума

#23 27-01-2011 17:44:48

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

Black_mirror
Да ну Вы что? Просто проверять, не превышает ли число 2^53. Дальше они всё равно все чётные.
Ну и не стоит забывать, что приоритет & ниже приоритета == . ;-)


No love, no mercy — no pain.

Вне форума

#24 27-01-2011 17:58:09

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

l_inc
Печально, если округление идёт к бесконечности можно конечно проверять числа на нечётность, то есть ксорить x и (x-1), правда в этом случае отдельное сравнение придётся делать не только для нуля, но и для единицы.
А нелогичность приоритета операций в Си меня опять удивила, вот где куча лишних скобочек, а не в Lisp'e как думают некоторые.

Вне форума

#25 27-01-2011 18:30:26

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

Black_mirror

int64 m=(*(int64*)&x1)^(*(int64*)&x);

__int64 m=__int64(x1)^__int64(x); // C++

Вне форума

Board footer

Работает на FluxBB.
Перевод FluxBB RU.