Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > в double хранится дробное число. какими функциями


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

Автор: Alexeis 14.11.2008, 10:45
double d;
int hi, lo;

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


Автор: Gunslinger 14.11.2008, 12:06
Alexeis, не нашел представление типа в памяти, поэтому код почти не понял. sizeof у double берет сначала дробную часть, затем дабл приводится к инту и ложется в целую часть? +1 - это пропустить знак?

Автор: Alexeis 14.11.2008, 12:22
Упс неправильно понял вопрос.

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

Автор: xvr 14.11.2008, 12:40
Цитата(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

Автор: vinter 14.11.2008, 12:47
Код

#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;
}

Автор: Ln78 14.11.2008, 13:51
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;
};


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

Автор: JAnty 29.4.2010, 17:15
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;




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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)