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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> выделить в числе типа double младший разряд 
:(
    Опции темы
susanin
Дата 22.10.2008, 12:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



здравствуйте, подскажите как можно в числе типа double выделить последний младший разряд? число заранее не известно, и сколько знаков после точки тоже неизвестно... к примеру имеем число 12.3245687 надо выделить 7 или 123.9876534 надо выделить 4... 
PM MAIL   Вверх
mrbrooks
Дата 22.10.2008, 12:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

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



susanin, преобразовать в строку и заиметь последний ее элемент (без учета '\0'  smile )
PM MAIL   Вверх
susanin
Дата 22.10.2008, 12:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(mrbrooks @ 22.10.2008,  12:06)
susanin, преобразовать в строку и заиметь последний ее элемент (без учета '\0'  smile )

об этом я думал...а более гуманного способа нету? smile 
PM MAIL   Вверх
mrbrooks
Дата 22.10.2008, 12:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

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



Цитата(susanin @  22.10.2008,  12:12 Найти цитируемый пост)
а более гуманного способа нету?

а в чем не гуманность?
PM MAIL   Вверх
Alexeis
Дата 22.10.2008, 12:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



Код

  double tmp;
  double c = 5.2544645;
  while (fabs(modf(c, &tmp)) > 0.1)
  {
     c *= 10;
  }
  int d = int(c) % 10;


Только нужно учесть что не все десятичные числа представимы непериодическими двоичными дробями, так что есть шанс получить не то число что ожидаешь.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
MAKCim
Дата 22.10.2008, 12:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


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

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



Код

int find_last_digit(double n)
{
    double low = n - floor(n), i, j;
    do {
        i = low * 10.;
        j = floor(i);
        low = i - j;
    } while (low != 0.);
    return (int)j;
}



--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
eyeofhell
Дата 22.10.2008, 12:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Адепт
*


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

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



Задача некорректная. В С++ числа с плавающей точкой не гарантируют точного представления. 12.324 / 2.0 может совершенно спокойно вернуть 6.1619999999999 или 6.16200000000001.

Так что имеет смысл просто округлять до нужного знака после запятой.

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


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

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



eyeofhell, а кто говорит об округлении. просят заиметь последнюю цифирь в переменной.

Добавлено @ 12:51
и все таки комрады чем плохо делать так:
Код

double d = 123.9876534;
char str[100]; 
sprintf(str,"%f",d);
//str[strlen(str)-1]] - собственно цифирь?


Это сообщение отредактировал(а) mrbrooks - 22.10.2008, 12:52
PM MAIL   Вверх
eyeofhell
Дата 22.10.2008, 13:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Адепт
*


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

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



Цитата

и все таки комрады чем плохо делать так:


В зависимости от реализации sprintf() в реальной жизни очень легко получить XX.XXX99999999 или XX.XXX00000001. Сомневаюсь что это то что нужно smile.
PM MAIL ICQ   Вверх
mrbrooks
Дата 22.10.2008, 13:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

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



Цитата(eyeofhell @  22.10.2008,  13:10 Найти цитируемый пост)

В зависимости от реализации sprintf() в реальной жизни очень легко получить XX.XXX99999999 или XX.XXX00000001

хороший аргумент что бы отказаться от моего способа  smile 

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

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


 




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


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

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