![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| Гость_Олег |
|
|||
|
Unregistered |
Как проверить переменную с плавающей точкой на не число?
|
|||
|
||||
| RAN |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 709 Регистрация: 14.3.2003 Где: Щёлково Моск.обл. Репутация: 5 Всего: 6 |
Вопрос не ясен совершенно.
|
|||
|
||||
| valex13 |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 243 Регистрация: 29.1.2003 Где: Иркук. область, г . Иркутск Репутация: нет Всего: 1 |
Можно поробовать так. Бежишь по строке (Если число у тебя в виде строки) и смотришь какой ASCII символ.
Что-то типа этого. Для Builder C++
только еще точку надо смотреть. Можно еще через исключения [CODE] try { double db = StrToInt( sMess); } catch(...){ MessageBox("Не число" )} [CODE] Это сообщение отредактировал(а) valex13 - 9.10.2003, 10:07 |
|||
|
||||
| Nastya |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 27.3.2002 Где: Мариуполь Репутация: 5 Всего: 44 |
Этот кусок
if (ich<48 || ich>57) Можно заменить на isdigit(ich) -------------------- Что бы понять рекурсию, надо понять рекурсию "Профессионал - это человек сделавший все возможные ошибки в очень узкой области". Н.Бор |
|||
|
||||
| Гость_Олег |
|
|||
|
Unregistered |
Замечание предыдущим авторам.
Нет, число не в строке. Эта переменная используется в расчетах и если там не число, то выдаётся предупреждение и т.д. Можно конечно перевести его в строку, но это падение производительности. И ещё, необходимо проверять именно на С, не используя ассемблерных вставок, так как код переносим под Solaris. |
|||
|
||||
| RAN |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 709 Регистрация: 14.3.2003 Где: Щёлково Моск.обл. Репутация: 5 Всего: 6 |
В переменной с плавающей точкой всегда число bool IsNumber(double x) { return true; } P.S. Поясни, чего хочешь. Приведи, например, фрагмент кода или ещё что. Короче, сделай так, чтоб тебя поняли. |
|||
|
||||
| Гость_Олег |
|
|||
|
Unregistered |
Товарищу RAN-у. Предыдущие авторы всё поняли.
Специально для Вас. «В переменной с плавающей точкой всегда число» - это не верно, например есть понятие NaN. Книга Ровдо А.А. «Микропроцессоры от 8086 до Pentium III….» страница 107, таблица по исключениям в FPU, там описаны эти не числа. Советую почитать. |
|||
|
||||
| Ars |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 325 Регистрация: 28.8.2003 Где: Московская обл. Репутация: 2 Всего: 2 |
(все содрано отсюда) Итого, используя битовые маски и соответствующие битовые операции, имхо, легко реализовать сабж -------------------- Есть многое на свете, друг Горацио, С чем очень долго можно прое..! |
||||
|
|||||
| RAN |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 709 Регистрация: 14.3.2003 Где: Щёлково Моск.обл. Репутация: 5 Всего: 6 |
Ха, ну вот. Помочь хотел, просто выяснить что надо. А он фамильярничать начал. "Товарищ", говорит, "Специально для Вас", говорит.
Я программированием занимаюсь не первый год. #include <float.h> _isnan() Если вернёт 0, то Not a number. Не понимаю, чем заслужил такое обращение. Просто надо было написать, что имеется в виду NaN. Ладно, проехали. |
|||
|
||||
| mr.DUDA |
|
|||
|
3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 25 Всего: 232 |
Блин, ну вы все даёте....
Так сложно ?? -------------------- ![]() |
|||
|
||||
| Fantasist |
|
||||
|
Лентяй ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1517 Регистрация: 24.3.2002 Репутация: 4 Всего: 41 |
Не только можно, а нужно!
А никто не просил проверять, является ли число целым. -------------------- Волны гасят ветер... |
||||
|
|||||
| Fantasist |
|
|||
|
Лентяй ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1517 Регистрация: 24.3.2002 Репутация: 4 Всего: 41 |
Не обращай внимания - некоторые иногда неадекватно воспринимают информацию. -------------------- Волны гасят ветер... |
|||
|
||||
| Гость_Oleg |
|
|||
|
Unregistered |
К сожалению _isnan() в моём случае не работает. Нашёл еще функцию _finite(). Привожу тест иллюстрирующих работу этих функций
double W = 0.; double E = 67.90; int T = _isnan(E); // T = 0 int R = _finite(E); // R = 1 E = 67.90/W; T = _isnan(E); // T = 0 R = _finite(E); // R = 0 E = 1.E308; E *= E; E *= E; E *= E; E *= E; E *= E; E *= E; E *= E; E *= E; E *= E; E *= E; E *= E; E *= E; T = _isnan(E); // T = 0 R = _finite(E); // R = 0 |
|||
|
||||
| Ars |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 325 Регистрация: 28.8.2003 Где: Московская обл. Репутация: 2 Всего: 2 |
Значит, описанные действия не приводят к ожидаемому результату
-------------------- Есть многое на свете, друг Горацио, С чем очень долго можно прое..! |
||||
|
|||||
| Jcs |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 156 Регистрация: 1.10.2003 Репутация: нет Всего: нет |
А чего у тебя дебугер показывает, когда E перед _isnan вычисляешь?
|
|||
|
||||
| Jcs |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 156 Регистрация: 1.10.2003 Репутация: нет Всего: нет |
Т.е, после деления на ноль?
|
|||
|
||||
| Гость_Oleg |
|
|||
|
Unregistered |
double W = 0.;
union { double E; int D[2]; }; E = 67.90; int T = _isnan(E); // T = 0 int R = _finite(E); // R = 1 E = 67.90/W; T = _isnan(E); // T = 0 Debug E 1.#INF000000000 R = _finite(E); // R = 0 E = 1.E308; E *= E; E *= E; E *= E; E *= E; E *= E; E *= E; T = _isnan(E); // T = 0 Debug E 1.#INF000000000 R = _finite(E); // R = 0 memset(&D,0xFF,2*sizeof(int)); T = _isnan(E); // T = 1 Debug E -1.#QNAN00000000 R = _finite(E); // R = 0 Понятно, что каждая функция делает то что должна, но была надежда, что есть одна, общая. Но и так нормально. |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |