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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> в double хранится дробное число. какими функциями, можно взять целую и дробную части? 
V
    Опции темы
Gunslinger
Дата 14.11.2008, 10:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Привет!
Вопрос в теме. Никаких округлений и прочего не нужно. Только разнести по интам.
PM MAIL   Вверх
Alexeis
Дата 14.11.2008, 10:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


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

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



double d;
int hi, lo;

memcpy(&lo, &d, sizeof(int));
memcpy(&hi, (int*)&d + 1, sizeof(int));



Это сообщение отредактировал(а) Alexeis - 14.11.2008, 12:22


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

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

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


Опытный
**


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

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



Alexeis, не нашел представление типа в памяти, поэтому код почти не понял. sizeof у double берет сначала дробную часть, затем дабл приводится к инту и ложется в целую часть? +1 - это пропустить знак?
PM MAIL   Вверх
Alexeis
Дата 14.11.2008, 12:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


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

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



Упс неправильно понял вопрос.

Добавлено через 6 минут и 14 секунд
Так просто разнести не получиться. у дабла может быть 16 знаков после запятой. 16 цифр просто не влезет в int, максимум 9.


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

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

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


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Цитата(Gunslinger @ 14.11.2008,  10:37)
Привет!
Вопрос в теме. Никаких округлений и прочего не нужно. Только разнести по интам.

Во первых это не получится сделать точно (в смысле, что собрав эти 2 части назад точно такой же double может не получится)
Во вторых, не совсем понятно, что значит 'записать дробную часть в int'? Это число, которое в своем первоначальном виде В ПРИНЦИПЕ не может быть представленно в виде int, т.к. оно всегда меньше единицы
В третьих, на уровне машинного представления double выражается как плавающее число с ДВОИЧНЫМ порядком, вам же как я понимаю нужен десятичный, а это не всегда можно преобразовать без потери точности
Если же нужно разобрать хоть как то, то можно так:
Код

double org_number=...;
int intergal_part=(int)org_number;
double fraction_part=org_number-intergal_part;
Только учтите, что даже целая часть double может не влезть в int


Это сообщение отредактировал(а) xvr - 14.11.2008, 12:41
PM MAIL   Вверх
vinter
Дата 14.11.2008, 12:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

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



Код

#define INT_DIGITS 9
bool foo( int &iNatural, int &iFloat, int iPrecision, double dNumber )
{
    if( iPrecision > INT_DIGITS )
        iPrecision = INT_DIGITS;
     iNatural = static_cast<int>( dNumber );
     iFloat = ( dNumber - iNatural ) * pow( 10, precision );
     return true;
}



--------------------
Мой блог
PM MAIL WWW   Вверх
Ln78
Дата 14.11.2008, 13:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Gunslinger, непонятно, что конкретно нужно. Вот примерно так представляется число double. 
Код

struct sDouble
{
   unsigned long fraction2;
   unsigned long fraction1   : 20;
   unsigned long exponent  : 11;
   unsigned long signum      :  1;
};

union uDouble
{
   double d;
   sDouble sd;
};


PM MAIL   Вверх
Gunslinger
Дата 14.11.2008, 14:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



разделение нужно было чисто для косметики: в борланде выводить 2 числа в метки, если в одном числе есть 0 - смещать метку с другим числом, чтобы одно под другим выводилось. Тогда проще будет приводить число к строке и парсить ее. Тогда еще проверку на запятую добавить. Тогда ограничений на размер не будет.

Это сообщение отредактировал(а) Gunslinger - 14.11.2008, 14:05
PM MAIL   Вверх
JAnty
  Дата 29.4.2010, 17:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



25,24765

Код

#include "math.h"
double d=25,24765;
int i;


d=modf(d,&i)  //  i=25,  d=0.24765

d=d*100000; // d=24765;




Вот как!!!!!!!!!!!!! КАКОМ К ВЕРХУ !!!

Это сообщение отредактировал(а) JAnty - 29.4.2010, 17:17


--------------------
Русский справочник по WinAPI

Возможно всё, что возможно вообразить! Это и значит быть гением как я!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

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

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

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

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


 




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


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

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