Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как проверить: число или нет? Как проверить? 
:(
    Опции темы
Гость_Олег
Дата 9.10.2003, 09:04 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Как проверить переменную с плавающей точкой на не число?
  Вверх
RAN
Дата 9.10.2003, 09:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Экс. модератор
Сообщений: 709
Регистрация: 14.3.2003
Где: Щёлково Моск.обл.

Репутация: 5
Всего: 6



Вопрос не ясен совершенно.

PM MAIL ICQ   Вверх
valex13
Дата 9.10.2003, 09:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 243
Регистрация: 29.1.2003
Где: Иркук. область, г . Иркутск

Репутация: нет
Всего: 1



Можно поробовать так. Бежишь по строке (Если число у тебя в виде строки) и смотришь какой ASCII символ.
Что-то типа этого. Для Builder C++
Код

bool TPayDocList::IsIntValue( AnsiString sMess)
{
       //TODO: Add your source code here
  for (int i=1;i<=sMess.Length();i++)
 {
   char *ch = (char*)&sMess[i];
   int ich = (int)*ch;
   if (ich<48 || ich>57) return (false);
 }
 return (true);
}

только еще точку надо смотреть.
Можно еще через исключения
[CODE]
try
{
double db = StrToInt( sMess);
}
catch(...){ MessageBox("Не число" )}
[CODE]

Это сообщение отредактировал(а) valex13 - 9.10.2003, 10:07
PM MAIL ICQ   Вверх
Nastya
Дата 9.10.2003, 09:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 27.3.2002
Где: Мариуполь

Репутация: 5
Всего: 44



Этот кусок
if (ich<48 || ich>57)

Можно заменить на isdigit(ich)


--------------------
Что бы понять рекурсию, надо понять рекурсию

"Профессионал - это человек сделавший все возможные ошибки в очень узкой области". Н.Бор
PM MAIL   Вверх
Гость_Олег
Дата 9.10.2003, 10:11 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Замечание предыдущим авторам.
Нет, число не в строке. Эта переменная используется в расчетах и если там не число, то выдаётся предупреждение и т.д.
Можно конечно перевести его в строку, но это падение производительности.
И ещё, необходимо проверять именно на С, не используя ассемблерных вставок, так как код переносим под Solaris.

  Вверх
RAN
Дата 9.10.2003, 10:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Экс. модератор
Сообщений: 709
Регистрация: 14.3.2003
Где: Щёлково Моск.обл.

Репутация: 5
Всего: 6



Цитата
Как проверить переменную с плавающей точкой на не число?

В переменной с плавающей точкой всегда число smile.gif

bool IsNumber(double x)
{
return true;
}

P.S. Поясни, чего хочешь. Приведи, например, фрагмент кода или ещё что. Короче, сделай так, чтоб тебя поняли.
PM MAIL ICQ   Вверх
Гость_Олег
Дата 9.10.2003, 13:07 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Товарищу RAN-у. Предыдущие авторы всё поняли.
Специально для Вас.
«В переменной с плавающей точкой всегда число» - это не верно, например есть понятие NaN.
Книга Ровдо А.А. «Микропроцессоры от 8086 до Pentium III….» страница 107, таблица по исключениям в FPU, там описаны эти не числа. Советую почитать.

  Вверх
Ars
Дата 9.10.2003, 14:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 325
Регистрация: 28.8.2003
Где: Московская обл.

Репутация: 2
Всего: 2



Цитата
формат чисел с плавающей точкой:

<- В сторону возрастания адресов

Короткое (одинарной точности)
S Порядок (8bit) Мантисса (23bits)

Длинное (двойной точности)
S Порядок (11bit) Мантисса (52bits)

Временное вещественное (расширенной точности)
S Порядок (15bit) Мантисса (64bits)

Где S - знаковый бит

Цитата
NAN имеет: поле порядка все биты 1, а поле мантиссы что угодно кроме нуля.

(все содрано отсюда)

Итого, используя битовые маски и соответствующие битовые операции, имхо, легко реализовать сабж




--------------------
Есть многое на свете, друг Горацио,
С чем очень долго можно прое..!
PM MAIL   Вверх
RAN
Дата 9.10.2003, 14:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Экс. модератор
Сообщений: 709
Регистрация: 14.3.2003
Где: Щёлково Моск.обл.

Репутация: 5
Всего: 6



Ха, ну вот. Помочь хотел, просто выяснить что надо. А он фамильярничать начал. "Товарищ", говорит, "Специально для Вас", говорит.

Я программированием занимаюсь не первый год.
#include <float.h>
_isnan()

Если вернёт 0, то Not a number.

Не понимаю, чем заслужил такое обращение. Просто надо было написать, что имеется в виду NaN. Ладно, проехали.
PM MAIL ICQ   Вверх
mr.DUDA
Дата 9.10.2003, 23:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 25
Всего: 232



Блин, ну вы все даёте.... biggrin.gif
Код
template<class T>
bool IsInteger(T number)
{
    return ((T)(int)number) == number;
}

//  пример:
double num = 1.15;
if(IsInteger(num))
{
    ...
}
else
{
    ...
}

Так сложно ??


--------------------
user posted image
PM MAIL WWW   Вверх
Fantasist
Дата 10.10.2003, 04:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй
***


Профиль
Группа: Участник Клуба
Сообщений: 1517
Регистрация: 24.3.2002

Репутация: 4
Всего: 41



Цитата
Можно заменить на isdigit(ich)


Не только можно, а нужно!


Цитата
Блин, ну вы все даёте....


А никто не просил проверять, является ли число целым.


--------------------
Волны гасят ветер...
PM MAIL   Вверх
Fantasist
Дата 10.10.2003, 05:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй
***


Профиль
Группа: Участник Клуба
Сообщений: 1517
Регистрация: 24.3.2002

Репутация: 4
Всего: 41



Цитата
Не понимаю, чем заслужил такое обращение.


Не обращай внимания - некоторые иногда неадекватно воспринимают информацию.


--------------------
Волны гасят ветер...
PM MAIL   Вверх
Гость_Oleg
Дата 10.10.2003, 11:17 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


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
Дата 10.10.2003, 13:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 325
Регистрация: 28.8.2003
Где: Московская обл.

Репутация: 2
Всего: 2



Цитата
К сожалению _isnan() в моём случае не работает

Значит, описанные действия не приводят к ожидаемому результату
Код

float a;
memset(&a,0xFF,sizeof(float));
bool IsNan=_isnan(a); // IsNan==true



--------------------
Есть многое на свете, друг Горацио,
С чем очень долго можно прое..!
PM MAIL   Вверх
Jcs
Дата 10.10.2003, 15:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 156
Регистрация: 1.10.2003

Репутация: нет
Всего: нет



А чего у тебя дебугер показывает, когда E перед _isnan вычисляешь?
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0535 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.