Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > синтаксис С (double)(unsigned int)d == d


Автор: Killer_13 3.5.2009, 00:27
Код

(double)(unsigned int)d == d

Вот такая строчка.
где "d" - число типа "double".
Я думаю, что это приведение переменной "d" из типа double в тип unsigned int и потом а что потом...... :(

Автор: fry 3.5.2009, 00:50
Возможно автор строк имел в виду округление числа путем приведения его к целому, а затем обратно к числу с двойной точностью (чтобы сравнить его с числом этого же типа). В конце концов эта строка имеет цель выяснить имеет ли число d дробную часть. Попробуй проверить концепцию, самому не охото.

Автор: Killer_13 3.5.2009, 01:53
Хмм, ну типо понятно, а где я могу почитать о таком синтаксисе? :( Читал о приведении типов в разных книгах, - такого не встречал.
Вот, да и придется рассказывать, че к чему, а я толком и не понимаю. :( 

Автор: gosn1ck 3.5.2009, 11:11
Цитата(Killer_13 @ 3.5.2009,  00:27)
Код

(double)(unsigned int)d == d

Вот такая строчка.
где "d" - число типа "double".
Я думаю, что это приведение переменной "d" из типа double в тип unsigned int и потом а что потом...... :(

строчка выдернута из условия?
я бы согласился с fry, но результат равенства будет непредсказуем

Автор: zim22 3.5.2009, 11:41
Цитата(gosn1ck @  3.5.2009,  11:11 Найти цитируемый пост)
но результат равенства будет непредсказуем

почему не предсказуем? я думаю, что результат всегда будет true.
т.к. переменная в С/С++ является синонимом адреса или смещения, а не "меткой" объекта.
следовательно независимо от того, в каком порядке будут вычислены аргументы оператора ==, сам оператор == отработает в последнюю очередь (т.е. тогда, когда преобразования над d будут завершены. а значит, левая и правая часть operator== будет указывать на одно и тоже значение.
***
=хотя код доказывает, что я думаю неправильно smile
Код

double x = 5.33;
if ((double)(unsigned int)x == x) { // внутрь блока if не заходит
  double d  = 10;
}


скорей всего компилятор создаёт временную переменную и поэтому их значения различны.
Код

double x = 5.33;
double temp =  (double)(unsigned int)x;
if (temp == x) { // внутрь блока if не заходит
  double d  = 10;
}

Автор: math64 3.5.2009, 12:21
Только это не проверка на целостность.
Если d < 0 || d > (double)(unsinged int)(-1), результат будет false, даже если d - целое.
Правильно будет d == floor(x)

Автор: Killer_13 3.5.2009, 12:38
да, это проверка на "unsigned int", с которым я уже наверное недели 2 парюсь. :(
А почему решил задать почти повторно вопрос, да потому, что при проверке , например несколько цифр и букв, это проходит проверку и пишет "что "введенное в строке число".
полностью выглядит это так. В предыдущей моей теме так подсказали, но я решил разбирать все до мелочей, так как многого не понимаю. Вот и прошу помощи у вас. пасибо.
Код

double d;
printf("\nZahl\n->");
scanf ("%lf", &d);
if (0 <= d && d <= UINT_MAX && (double)(unsigned int)d == d) // ob Zahl "d" Ganze Zahl ist
printf("\nUnsigned int");  // это unsigned int
else
printf("\nNICHT Unsigned int");

Автор: math64 3.5.2009, 13:43
Код

char line[80];
int i, len;
#ifdef USE_DOUBLE
double d;
#else
unsigned int u;
#endif
bool isUnsigendInt = true;
printf("\nZahl\n->");
gets(line);
len = strlen(line);
#ifndef USE_DOUBLE
u = 0;
#endif
for (i = 0; i < len; i++) {
  char c = line[i]
  if (c < '0' || c > '9') {
    isUnsignedInt = false;
    break;
  }
#ifndef USE_DOUBLE
  if (u > UINT_MAX / 10 || u == UINT_MAX / 10 && c > '0' + UINT_MAX % 10) {
    isUnsignedInt = false;
    break;
  }
  u = u * 10 + c - '0';
#endif
}
#ifdef USE_DOUBLE
if (isUnsignedInt) {
  sscanf (line, "%lf", &d);
  if (d < 0 || d > UINT_MAX || (double)(unsigned int)d != d) 
    isUnsignedInt = false;
}
#endif
if (isUnsignedInt)
  printf("\nUnsigned int");  // это unsigned int
else
  printf("\nNICHT Unsigned int");

Автор: gosn1ck 3.5.2009, 13:48
а почему нельзя было бы условие поменять на if (0 <= d && d <= UINT_MAX && d == floor(d)) как говорили вы выше?)

Автор: math64 3.5.2009, 13:54
Тут ошибка: если нечего не ввели, то будет ответ 'да',
а если были пробелы до или после то 'нет'.
но думаю ты сам это исправишь

Добавлено через 1 минуту и 6 секунд
Цитата(gosn1ck @  3.5.2009,  13:48 Найти цитируемый пост)
а почему нельзя было бы условие поменять на if (0 <= d && d <= UINT_MAX && d == floor(d)) как говорили вы выше?)

Можно

Автор: Killer_13 3.5.2009, 13:56
math64 - вы я смотрю серьезный человек. smile Мне еще далеко до такого программирования, мне просто нужно делать и учиться простому. smile
Я просто хочу разобраться, если я к примеру впихну в свою задачку ваш код и понесу показывать преподу, че он по вашему подумает? smilesmilesmilesmile
Спасибо, попробую с floor

Добавлено через 4 минуты и 12 секунд


Хмм, а почему например проскакивает "34,2" или "356ds" - "иф" пропускает, - и в конце выдает что эти числа типа "unsigned int"

Автор: math64 3.5.2009, 14:17
Мой код сочетает два варианта 
1. Ручной разбор числа (USE_DOUBLE не определён)
2. Использование double. Но пользователь может ввести 1.0, это не unsigned int, а твоя программа ответит "да". Поэтому в любом случае нужно вводить строку и проверять, что введены только цифры.
Преподавателю нужно нести один вариант, в котором #ifdef убран

Добавлено через 3 минуты и 27 секунд
Цитата(Killer_13 @  3.5.2009,  13:56 Найти цитируемый пост)
Хмм, а почему например проскакивает "34,2" или "356ds" - "иф" пропускает, - и в конце выдает что эти числа типа "unsigned int"

scanf() сканирует только число, всё что за ним оставляет в потоке. И использует английскую нотацию с десятичной точкой, а не запятой, как в России и Германии.

Автор: gosn1ck 3.5.2009, 14:56
Цитата(Killer_13 @ 3.5.2009,  13:56)
math64 - вы я смотрю серьезный человек. smile Мне еще далеко до такого программирования, мне просто нужно делать и учиться простому. smile
Я просто хочу разобраться, если я к примеру впихну в свою задачку ваш код и понесу показывать преподу, че он по вашему подумает? smilesmilesmilesmile
Спасибо, попробую с floor

Добавлено @ 14:00


Хмм, а почему например проскакивает "34,2" или "356ds" - "иф" пропускает, - и в конце выдает что эти числа типа "unsigned int"

а что собственно было не понятно с самого начала? 
Порядок применения унарный операций  и операции присваивания "справа налево", а всех остальных "слева направо" (Страуструп  80 - 81 страницы) другое дело что операции выполнялись не так как хотелось бы smile 

Автор: Killer_13 3.5.2009, 15:05
Мне непонятен был синтаксис. Я просто нигде не встречал такого синтаксиса. :(

Автор: Killer_13 3.5.2009, 15:38
Может кто подсказать, почему от максимального значения типа всегда минусуется единица?
тоисить например максимальное значение 4 294 967 296, а вводить можно 4 294 967 295?
Спасибо.

Автор: zim22 3.5.2009, 17:09
Цитата(Killer_13 @  3.5.2009,  15:38 Найти цитируемый пост)
тоисить например максимальное значение 4 294 967 296, а вводить можно 4 294 967 295?

потому что "ноль" тоже число.

Автор: Killer_13 3.5.2009, 18:51
Спасибо.

Автор: math64 4.5.2009, 08:31
Цитата(Killer_13 @  3.5.2009,  15:38 Найти цитируемый пост)
Может кто подсказать, почему от максимального значения типа всегда минусуется единица?тоисить например максимальное значение 4 294 967 296, а вводить можно 4 294 967 295?Спасибо.

4 294 967 296 = 0x1uLL << 32 = 0x100000000uLL; в unsigned long не влезет, нужно unsigned __int64.
4 294 967 295 = (unsigned long)(0x1uLL << 32) = 0xFFFFFFFFuL; - как раз макисмальное unsigned long
Диапазон для long:
Минимум (long)(-(0x1uL << 31)) = (long)0x80000000L;
Максимум (long)((0x1uL << 31)-1) = (long)0x7FFFFFFFL;
Отрицательных чисел на одно больше

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)