Как определить четность числа типа real (т.е., нецелочисленный тип), без приведения к целому типу и использования остатка целочисленного деления? PS: или как из типа real получить тип integer, не пользуясь функцией trunc(). Есть тут знатоки паскаля?
Использовать в качестве показателя степени. Вообще говоря, смысла в этом никакого, просто у младшего братца преподаватель чудит. Кажется, взятку хочет, но пока мы идем на принцип.
Код (Text): #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"); } Сойдёт?
Не буду утверждать, что это неверно в общем случае. Нельзя делить - умножьте на 0,5 и сравните дробную часть по модулю с eps = 0,00...1.
Squash Тему в HEAP или в BEGINNERS WASM.ZEN совсем не для этого, ТС нужно было хотя бы пару тем почитать в этой ветке прежде, чем создавать сообщение
Mikl___ Я считаю, что вы неправы. И топики, подобные этому, в ветке есть. Хотя бы http://www.wasm.ru/forum/viewtopic.php?id=39270
Squash Если предмет профилирующий, то лучше платить. Все равно на последующих курсах с этим преподом еще не раз встретишься Вообще в таких ситуациях нужно спрашивать так: "Как себя вести на лентах чтобы пофиг было четное число или нет?" )))
Booster Если намёк на двоичное представление double, то недостаточно. Надо найти номер последнего значащего бита мантиссы (начиная с неявной единицы на условно нулевой позиции) и проверить, не превышает ли он разность между значением в поле порядка и базой (1023 для double). Если разность больше, то число чётное. Нуль надо вообще обрабатывать особым образом. В общем случае учитывать надо все биты представления.
Squash ну если это только проблема найти еще какую-нить функцию пасквиля, то справочник по пасквилю поможет вам быстрее чем форум по низкоуровневому проганью понятие четность для не целых чисел не определено, более того для больших чисел как например число Авогадро 6.02 * 10^23 или скорость света в ангстремах в секунду последние знаки представляют весьма малый интерес
Black_mirror Наверное, Frac? Если преподавателя не устроил Trunc, то вряд ли есть смысл подсовывать ему аналоги.
Для чисел типа double больших чем единица бит соответствующий единице можно проверить так: double x1=x+1; int64 m=(*(int64*)&x1)^(*(int64*)&x); if(m&(m-1)==0) чётное; else нет;