Проверка, является ли число целым числом в C ++
Я ищу способ проверить, имеет ли определенная переменная целое число или нет. Моя программа запрашивает у пользователя значения набора переменных, а затем вычисляет переменную k, необходимую для того, чтобы сделать другую переменную e целым числом. Код для вычисления k по существу является циклом for, который увеличивает k от нуля до тех пор, пока не достигнет значения, делающего e целым числом. Но я не могу понять, как проверить, что e является целым числом. Вот код, о котором я думаю:
for (int k = 0; k!=wk; k++) < e = (1+k*f_n)/d; if() >
Переменная wk только что существует, так что, когда e является целым числом, wk должно быть равно k, и поэтому цикл заканчивается.
Mohamed Ahmed 29 апр. 2014, в 23:17
Поделиться
@πάνταῥεῖ πάνταῥεῖ Этот вопрос содержит ответы на языке r
gha.st 29 апр. 2014, в 21:00
@πάνταῥεῖ πάνταῥεῖ другой вопрос не c ++
Tom Fenech 29 апр. 2014, в 21:00
Сравните значение (int)e с e и убедитесь, что они равны .
abiessu 29 апр. 2014, в 21:00
Что было объявлено?
Jeremy Friesner 29 апр. 2014, в 21:02
Какой тип е?
OMGtechy 29 апр. 2014, в 21:02
@gha.stgha.st Извините, это было слишком быстрое голосование! Но я почти уверен, что есть подходящий дуэль для с ++.
Проверка на ввод целого числа
У меня есть функция, в которой я проверяю ввод пользователя. Реализовал эту проверку через цикл do-while. Логику условно можно поделить на 2 части. В первой части я проверяю, является ли число, которое вводит пользователь — целым (int), во второй — проверяю, подходит ли мне вообще это целое число. Вторая часть работает: если ввести целое число, которое мне не подходит, то там выводится сообщение об ошибке и предлагается ввести число ещё раз. При вводе же не целого числа происходит вакханалия, которая на скрине. В чем может быть проблема? Полный код функции:
int gameboardSize(void) < int size; bool status(false); // для проверки на ввод "нормального" размера поля, желания продолжить игру do < cout > "; if (std::cin >> size) <> else < cout > "; > if (size > 2 && size < 10 && size >0) < status = true; >else < cout > while (status != true); return size; >
Отслеживать
218k 15 15 золотых знаков 118 118 серебряных знаков 229 229 бронзовых знаков
как проверить целое ли число язык си
мне нужно что бы пользователь ввел три целых чисел а если числа не целые то программа закрывалась я пытался делать проверку вот пример только здесь я зделал одно число что бы было проще забыл сказать нельзя использовать библеотеку math.h
int main() < int num1 = 0; scanf("%d", &num1); if (num1 % 1 != 0)< printf("eror"); >printf("%d", num1); >
только здесь оно округляет число сразу после ввода а это мне не нужно дальше я поменял переменную на double но компилятор стал ругать меня
int main() < double num1; scanf("%lf", &num1); if (num1 % 1 !=0) < printf("eror"); >printf("%lf", num1); >
помогите решить эту проблему
Отслеживать
задан 19 июн 2021 в 10:01
Михаил Кузнецов Михаил Кузнецов
29 1 1 серебряный знак 6 6 бронзовых знаков
Остаток от деления вещественного числа на 1 — это сильно :-). Сделайте проще: используйте приведение типа в условии (int) num1 != num1 . Кроме этого, Ваша программа напечатает число в любом случае, даже если оно не «целое». Но это уже другая история.
19 июн 2021 в 10:15
я сделал вот так ((int)num1 % 1 != num1) и все работает спасибо. проверил еще так работает (num1 % 1 != num1)
19 июн 2021 в 10:25
нееет! зачем (int)num1 % 1 ?! приведение типа уже делает целое число, зачем для целого числа бесполезное %1 . Тем более, что итоговая проверка с таким условием будет неверной.
19 июн 2021 в 10:28
мантисса типа double имеет размер 52 бита. К типу int нельзя приводить. Только к int64_t.
19 июн 2021 в 10:35
не судите строго я только начал учить программирование :3 я просто скопировал и вставил в место старого условия и оно не работает( или я вас не правильно понял
19 июн 2021 в 10:35
3 ответа 3
Сортировка: Сброс на вариант по умолчанию
# include # include # include static inline bool isint ( double d ) < return d == (int64_t)d ; >int main()
isint(3) = 1 isint(3.1) = 0
дополнение
Если нужна точность и важность пределов целочисленного типа, то нужен двойной контроль. Сначала считываем число, потом пишем в строку. Будет считать, что введённое выражение удовлетворяет условиям, если запись целочисленного числа в сторку совпадает с введённым выражением. Не поддерживается запись с экспонентой 1e1 , с точкой 1.0 и положительное число со знаком плюс +1 .
char s[100] ; scanf("%99s",s); int i ; sscanf(s,"%d",&i); char s2[100] ; sprintf(s2,"%d",i); if (strcmp(s,s2)==0) printf("integer %d\n",i); else printf("is not integer %s\n",s);
integer 1234567890 is not integer 12345678901
Как проверить целое ли число c
Лучше всегда использовать double (float только для хранения в больших массивах).
Давно C++ не использовал, но на сколько я помню такие вещи делаются через оператор привидения типов:
Все другие привидения — это что-то унаследованное от С . В С++ для каждого случая есть свой оператор.
Для проверки встроенных типов данный подход не подойдет. В различных компиляторах есть макросы, например, __typeof__ . Они специфичны для конкретного компилятора.
C++ Поддерживает урезанный RTTI. Возможно использовать только языковые возможности C++ , посмотрите на этот код:
Для этого надо подключить math.h.
Некоторые могут возразить, что сравнивать числа с плавающей запятой на равенство неправильно. Но если бы это было неправильно всегда, компилятор бы такое в принципе не позволял. В данном случае целые числа могут быть представлены точно в double. Операции сложения, вычитания и умножения для целых чисел также дадут целые числа, так как не вносят погрешностей округления. Для чисел, заданных вручную или полученных таким способом, проверка выше сработает корректно. Если всё же нужно проверить, что число целое в пределах некоторой погрешности eps (например 0.000001), можно использовать следующую проверку:
Или если в используемой версии стандартной библиотеки доступна функция round:
Эти два варианта используют округление к ближайшему целому, чтобы разность между этим и исходным числом была в интервале (-0.5; 0.5], а не [0; 1), как в случае округления к меньшему.
Проверить, целое число или нет
С использованием цикла While написать программу :Дано целое число N. Проверить является ли число N числом Фибоначчи
Помогите пожалуйста 1)с использованием цикла While и без масивов написать программу которая.
Как проверить, целое ли число?
Есть идея перевести в стринг и искать точку или перевести в инт и сравнить
Целое или нет?
В с# мне нужно проверить является это число целым или нет. Помогите написать програмку на лёгком.
Дано целое число N. Найти наименьшее целое положительное число K, при котором выполняется неравенство 3^k > N.
Используя цикл while Дано целое число N. Найти наименьшее целое положительное число K, при котором.
Как проверить целое ли число c
5 декабря стартовал курс « Python для Пентестера © » от команды The Codeby
Понятные и наглядные учебные материалы с информацией для выполнения ДЗ; Проверка ДЗ вручную – наставник поможет улучшить написанный вами код; Помощь преподавателей при выполнении заданий или в изучении теории; Групповой чат в Telegram с другими учениками, проходящими курс; Опытные разработчики – команда Codeby School, лидер по информационной безопасности в RU-сегменте
Запись на курс до 15 декабря. Подробнее .
Бесплатный курс по пентесту от Школы Кодебай
Запишись на вводный видеокурс по пентесту , состоящий из 24 уроков. Разные инструменты, тактики и навыки: сканирование сети, фаззинг, брутфорс, сниффинг, sql-инъекции, mimikatz, загрузка полезной нагрузки, эксплуатация разных уязвимостей, XSS, CSRF и немного Reverse-shell. Будет полезен для быстрой подготовки к CTF, а так же для прохождения курсов « SQL Injection Master » и « WAPT ».
Бесплатный курс SQL Injection от Школы Кодебай
Запишись на вводный курс по SQL инъекциям. Курс состоит из 6 видео уроков. К каждому уроку приложена методичка. Есть общий чат для учащихся. Будет полезен для быстрой подготовки к CTF, а так же для прохождения курсов « SQL Injection Master » и « WAPT ».
Как проверить целое ли число c
Здравствуйте, Аноним, Вы писали:
А>и подвопросик — как отрезать дробную часть?
| От: | Аноним |
| Дата: | 20.04.06 08:31 |
| Оценка: |
Здравствуйте, Аноним, Вы писали:
А>и подвопросик — как отрезать дробную часть?
В каком представлении у тебя число?
Строка, double, или вообще что-то другое?
| От: | piAnd |
| Дата: | 20.04.06 08:45 |
| Оценка: |
| От: | Mickey_from_nsk |
| Дата: | 20.04.06 09:17 |
| Оценка: |
| От: | FoolS.Top |
| Дата: | 20.04.06 09:20 |
| Оценка: |
| От: | Аноним |
| Дата: | 20.04.06 09:30 |
| Оценка: |
| От: | Pavel Dvorkin |
| Дата: | 20.04.06 09:46 |
| Оценка: |
Здравствуйте, Аноним, Вы писали:
Прочитал все ответы. Все они некорректны ИМХО.
Во-первых, число может оказаться , скажем, 19.9999999999999. Оно целое или нет ? А если да, то сколько из него надо вычесть, чтобы оно стало нецелым ? 19.999999999999 — еще целое ? А 19.99999999999 ? А это ведь ошибка представления в двоичной системе, всего лишь.
Во-вторых, преобразование к int может банально не пройти из-за диапазона значений.
float a = 1E35; // и как Вы это в int преобразуете ?
На мой взгляд, единственно, что возможно
1. Определить понятие целого вещественного числа. Т.е. считать его целым, если оно отличается от ближайшего целого не более, чем на eps, которое надо установить волевым путем.
2. После того, как это определено, преобразовать это число в строку (sprintf(s,»%f», a) и провести анализ строки. Упражнение для олимпиад по программированию среди школьников.
| От: | Mickey_from_nsk |
| Дата: | 20.04.06 10:03 |
| Оценка: |
Здравствуйте, Pavel Dvorkin, Вы писали:
PD>Прочитал все ответы. Все они некорректны ИМХО.
Логично. Сильной философии тут не разводили. Так, жизненные проблемы решали.
PD>Во-первых, число может оказаться , скажем, 19.9999999999999. Оно целое или нет ? А если да, то сколько из него надо вычесть, чтобы оно стало нецелым ? 19.999999999999 — еще целое ? А 19.99999999999 ? А это ведь ошибка представления в двоичной системе, всего лишь.
А ты можешь гарантировать, что это ошибка? Может это намеренное искажение?
PD>Во-вторых, преобразование к int может банально не пройти из-за диапазона значений.
Может и не пройти. Но можно число «запихнуть» в нужный диапазон.
PD>float a = 1E35; // и как Вы это в int преобразуете ?
Получим overflow, ясен пень — не целое
PD>На мой взгляд, единственно, что возможно
PD>1. Определить понятие целого вещественного числа. Т.е. считать его целым, если оно отличается от ближайшего целого не более, чем на eps, которое надо установить волевым путем.
PD>2. После того, как это определено, преобразовать это число в строку (sprintf(s,»%f», a) и провести анализ строки. Упражнение для олимпиад по программированию среди школьников.
Или такой вариант — выдать на экран и спросить у пользователя.
Без обид — все можно раскритиковать. Везде можно поставить массу условий при которых работать все равно не будет. (в твоем примере тоже, как многие говорят, лучше snprintf использовать или ostringstream).
Даем варианты, другим — выбирать.
| От: | Pavel Dvorkin |
| Дата: | 20.04.06 10:09 |
| Оценка: |
Здравствуйте, Mickey_from_nsk, Вы писали:
PD>>Во-первых, число может оказаться , скажем, 19.9999999999999. Оно целое или нет ? А если да, то сколько из него надо вычесть, чтобы оно стало нецелым ? 19.999999999999 — еще целое ? А 19.99999999999 ? А это ведь ошибка представления в двоичной системе, всего лишь.
M__>А ты можешь гарантировать, что это ошибка? Может это намеренное искажение?
Я же ясно пишу — понятие целого вещественного числа не определено.
PD>>float a = 1E35; // и как Вы это в int преобразуете ?
M__>Получим overflow, ясен пень — не целое
Почему ? 1E35 очень даже целое.
PD>>1. Определить понятие целого вещественного числа. Т.е. считать его целым, если оно отличается от ближайшего целого не более, чем на eps, которое надо установить волевым путем.
PD>>2. После того, как это определено, преобразовать это число в строку (sprintf(s,»%f», a) и провести анализ строки. Упражнение для олимпиад по программированию среди школьников.
M__>Или такой вариант — выдать на экран и спросить у пользователя.
Тоже годится . Но я все же предложил програмный путь.
M__>Без обид — все можно раскритиковать. Везде можно поставить массу условий при которых работать все равно не будет. (в твоем примере тоже, как многие говорят, лучше snprintf
Не обязательно. Если размер буфера == 100, выйти за его пределы невозможно.
| От: | Mickey_from_nsk |
| Дата: | 20.04.06 10:17 |
| Оценка: |
| От: | Аноним |
| Дата: | 20.04.06 10:37 |
| Оценка: |
А>>>и подвопросик — как отрезать дробную часть?
А>>В каком представлении у тебя число?
А>>Строка, double, или вообще что-то другое?
А>ну на самом деле с float можно применить варианты выше. А вот с double такой врядтле прокатит.
А в чем принципиальная разница между float и double
А> Лично я использую float и именно такой способ как написан выше. Мне интересно есть ли ещё варианты
Ничего не понимаю
| От: | HiSH | http://m0riarty.ya.ru |
| Дата: | 20.04.06 10:41 | |
| Оценка: |
Здравствуйте, Mickey_from_nsk, Вы писали:
PD>>Тоже годится . Но я все же предложил програмный путь.
M__>Ну кстати, анализ тогда можно свести к поиску десятичной точки
1e6 и 1e-6 — оба не содержат десятичной точки
| От: | SWW |
| Дата: | 20.04.06 10:42 |
| Оценка: |
PD>Прочитал все ответы. Все они некорректны ИМХО.
PD>Во-первых, число может оказаться , скажем, 19.9999999999999. Оно целое или нет ?
Нет. Вопрос был, как отрезать дробную часть. Здесь она 0.9999999999999, а целая — 19
PD> А если да, то сколько из него надо вычесть, чтобы оно стало нецелым ? 19.999999999999 — еще целое ? А 19.99999999999 ? А это ведь ошибка представления в двоичной системе, всего лишь.
Если бы надо было округлить — именно так и спросили бы.
PD>Во-вторых, преобразование к int может банально не пройти из-за диапазона значений.
PD>float a = 1E35; // и как Вы это в int преобразуете ?
У floor() такой проблемы нет.
PD>На мой взгляд, единственно, что возможно
PD>1. Определить понятие целого вещественного числа. Т.е. считать его целым, если оно отличается от ближайшего целого не более, чем на eps, которое надо установить волевым путем.
PD>2. После того, как это определено, преобразовать это число в строку (sprintf(s,»%f», a) и провести анализ строки. Упражнение для олимпиад по программированию среди школьников.
| От: | Erop |
| Дата: | 20.04.06 10:56 |
| Оценка: |
Здравствуйте, Pavel Dvorkin, Вы писали:
PD>На мой взгляд, единственно, что возможно
PD>1. Определить понятие целого вещественного числа. Т.е. считать его целым, если оно отличается от ближайшего целого не более, чем на eps, которое надо установить волевым путем.
PD>2. После того, как это определено, преобразовать это число в строку (sprintf(s,»%f», a) и провести анализ строки. Упражнение для олимпиад по программированию среди школьников.
Я согласен, что задача некорректная. Так что хотят на самом деле не понятно. Так что не понятно и какой ответ про 1e35 правильный, например и про 5 — DBL_EPS тоже
Но что мнея порадовало, так этоп редложение анализировать строку.
Может проще всё-таки само число?
| От: | Mickey_from_nsk |
| Дата: | 20.04.06 10:56 |
| Оценка: |
| От: | Кодт | |
| Дата: | 20.04.06 10:59 | |
| Оценка: | 1 (1) | |
Здравствуйте, Pavel Dvorkin, Вы писали:
PD>Во-первых, число может оказаться , скажем, 19.9999999999999. Оно целое или нет ? А если да, то сколько из него надо вычесть, чтобы оно стало нецелым ? 19.999999999999 — еще целое ? А 19.99999999999 ? А это ведь ошибка представления в двоичной системе, всего лишь.
PD>Во-вторых, преобразование к int может банально не пройти из-за диапазона значений.
PD>float a = 1E35; // и как Вы это в int преобразуете ?
Во-первых, есть диапазон целых чисел, представимых с помощью float / double. Это те, чья разрядность равна разрядности мантиссы (минус один недостоверный разряд).
20 — представимое. Поэтому 19.99999 — это всё-таки не 20 ровно, а 20-eps. Нужно знать природу этого eps, прежде чем говорить.
Потому что
Вот если бы взяли число 1.99999999e10f — 2*10^10 ещё влезает в int, но уже вылезло из мантиссы float. Оно непредставимо, и здесь мы неизбежно имеем дело с погрешностью.
PD>На мой взгляд, единственно, что возможно
PD>1. Определить понятие целого вещественного числа. Т.е. считать его целым, если оно отличается от ближайшего целого не более, чем на eps, которое надо установить волевым путем.
Какой-такой волевой путь?
Любому значению соответствует некоторая погрешность конкретно этого значения — связанная не только с ошибками представления, но и с ошибками ввода, ошибками вычислений и т.д.
Эти погрешности рассчитываются, а не берутся с потолка.
Если трассировать погрешности всех значений проблематично — то можно сделать оценку сверху, т.е. загрубить конечный результат.
И вот тогда, для значения (x,eps) представляющего «нечто в диапазоне (x-eps,x+eps)» можно говорить, что оно ещё и представляет некое целое число, попавшее в этот диапазон. Хорошо, если это число одно.
PD>2. После того, как это определено, преобразовать это число в строку (sprintf(s,»%f», a) и провести анализ строки. Упражнение для олимпиад по программированию среди школьников.
Для извращенцев.
Хотя бы потому, что sprintf переводит в десятичную запись и тем самым вносит дополнительные погрешности.
| От: | Pavel Dvorkin |
| Дата: | 20.04.06 12:08 |
| Оценка: |
Здравствуйте, Erop, Вы писали:
E>Но что мнея порадовало, так этоп редложение анализировать строку.
E>Может проще всё-таки само число?
Теперь понял, за что ты смайлик поставил
Можно и число, но, боюсь, дело кончится ассемблером с анализом битового представления формата плавающих чисел. Потому что есть float, есть double, есть (пусть и нет его в VC) long double. А как иначе — я с трудом представляю. Расскажи, если знаешь как.
| От: | Pavel Dvorkin |
| Дата: | 20.04.06 12:20 |
| Оценка: |
Здравствуйте, Кодт, Вы писали:
К>Во-первых, есть диапазон целых чисел, представимых с помощью float / double. Это те, чья разрядность равна разрядности мантиссы (минус один недостоверный разряд).
К>20 — представимое. Поэтому 19.99999 — это всё-таки не 20 ровно, а 20-eps. Нужно знать природу этого eps, прежде чем говорить.
К>Потому что
К>
В этом виде природа eps определяется исходя из формата представления чисел IEEE (номер не помню). И, естественно, eps зависит от абсолютной величины числа.
PD>>На мой взгляд, единственно, что возможно
PD>>1. Определить понятие целого вещественного числа. Т.е. считать его целым, если оно отличается от ближайшего целого не более, чем на eps, которое надо установить волевым путем.
К>Какой-такой волевой путь?
К>Любому значению соответствует некоторая погрешность конкретно этого значения — связанная не только с ошибками представления, но и с ошибками ввода, ошибками вычислений и т.д.
К>Эти погрешности рассчитываются, а не берутся с потолка.
Вот здесь не соглашусь. Есть еще погрешности входных данных. Они определяются не математикой, а точностью прибора и т.д. Так что числа, полученные из эксперимента, можно считать целыми (если это кому-то нужно), только в том случае, когда они отличаются от математического целого не более чем на эту погрешность эксперимента. Это и есть то, что я хотел сказать, говоря о волевом пути. К примеру, вес любого предмета в граммах, полученный с помощью магазинных весов, есть число целое всегда — эти весы доли грамма не дают. Поэтому можно считать целым любой вес в граммах, полученный таким образом. То же численно значение веса, полученное с помощью аналитических весов, целым не будет. Так что в реальной задаче eps определяется все же именно из самой задачи (волевым путем).
Иными словами, эти погрешности определяются еще и нематематическим фактором.
К>Если трассировать погрешности всех значений проблематично — то можно сделать оценку сверху, т.е. загрубить конечный результат.
К>И вот тогда, для значения (x,eps) представляющего «нечто в диапазоне (x-eps,x+eps)» можно говорить, что оно ещё и представляет некое целое число, попавшее в этот диапазон. Хорошо, если это число одно.
PD>>2. После того, как это определено, преобразовать это число в строку (sprintf(s,»%f», a) и провести анализ строки. Упражнение для олимпиад по программированию среди школьников.
К>Для извращенцев.
К>Хотя бы потому, что sprintf переводит в десятичную запись и тем самым вносит дополнительные погрешности.
Предложи что-то иное. Я кроме анализа битов двоичного представления ничего не вижу.
| От: | Pavel Dvorkin |
| Дата: | 20.04.06 12:24 |
| Оценка: |
Здравствуйте, SWW, Вы писали:
PD>>Прочитал все ответы. Все они некорректны ИМХО.
PD>>Во-первых, число может оказаться , скажем, 19.9999999999999. Оно целое или нет ?
SWW>Нет. Вопрос был, как отрезать дробную часть. Здесь она 0.9999999999999, а целая — 19
Это есть десятичное представление двоичного числа. Представление такое в общем случае точным быть не может. Так что если это 19.9999999999999 получилось в результате расчета, вполне возможно, это 20.0000000000001. А делать серьезный вывод ( 19 или 20, .9999999999999 или .000000000001) уж точно не стоит.
Похожие публикации:
- Как создать сайт на javascript
- Snappy driver installer что это
- Git push force что делает
- За сколько можно выучить java
