Как выяснить, сколько десятичных цифр в большом двойном? - PullRequest
0 голосов
/ 16 мая 2011

Эй, я делаю функцию, которая возвращает количество десятичных, целых или ОБЩИХ чисел, которые есть, но не может заставить его работать любым из следующих способов:

  • умножение на действительно большое число , например, 10 миллиардов, не работает из-за неточности, с которой компьютеры хранят десятичные дроби, составляя 2,3

  • Использование StringStream для преобразования числа в строку и подсчета символов не работает, поскольку для этого требуется установить точность потока, которая либо убирает, либо добавляет ненужные '0 'символов, если не установлено фактическое количество десятичных знаков

Так ЧТО ДЕЛАТЬ СЕЙЧАС? кто-нибудь, пожалуйста, помогите = ( Спасибо!

если вы хотите увидеть мою функцию, которая преобразует онемение в строку, вот она:

//////////////////////      Numbs_Digits    ////////////////////////////////////////////////
template<typename T>
int Numbs_Digits(T numb, int scope)
{
    stringstream ss(stringstream::in| stringstream::out), ss2(stringstream::in| stringstream::out);
        unsigned long int length= 0;
        unsigned long int numb_wholes;
                          ss2 << (int)numb; 
                          numb_wholes = ss2.str().length(); ss2.flush();
        bool all= false;
        ss.precision(11);   // HOW DO I MAKE THE PRECISION NUMBER THE NUMBER OF DECIMALS?

    switch(scope){
        case ALL:        all = true;

        case DECIMALS:   ss << fixed << numb;
                         length += ss.str().length()- (numb_wholes +1); // +1 for the "."
                         if(all!= true) break;

        case WHOLE_NUMBS: 
                         length += numb_wholes;
                         if(all!= true) break;

        default: break;}

        return length;};

Ответы [ 3 ]

3 голосов
/ 16 мая 2011

Если вы хотите узнать максимальное количество десятичных цифр, которое может хранить long double, это значение доступно в константе LDBL_DIG, определенной в cfloat.Обратите внимание, что это число на самом деле является приблизительным, поскольку значения хранятся в двоичном виде внутри, и, таким образом, диапазон значений не является степенью 10.

2 голосов
/ 16 мая 2011

Только некоторые десятичные числа могут быть сохранены в точной форме как число с плавающей запятой.Из-за этого нет способа определить, сколько десятичных разрядов значимо для любого десятичного числа, для которого это не так.Как предположил Хаммар, читая о формате хранения с плавающей запятой, я считаю, что каждый программист должен обладать некоторыми знаниями о низкоуровневых вещах, таких как:Это работает из-за неточности, с которой компьютеры хранят десятичные дроби, что составляет 2.3 2.2999575697

Это как раз та проблема.Можете ли вы взглянуть на 2.999575697 и сказать, что в нем есть два знака после запятой?Это число является примером десятичного числа, которое не может быть сохранено в точной форме с использованием формата с плавающей запятой.Лучшее, что вы могли бы сделать, - это подсчитать значащие десятичные разряды, хранящиеся в числе с плавающей запятой, которое наилучшим образом приближается к исходному десятичному числу, которое было ему дано - что я не могу себе представить, было бы много пользы.объяснение.

0 голосов
/ 16 мая 2011

Не можете ли вы установить для точности ios_base максимальное количество десятичных цифр в значениии на вашей платформе в cfloat.h, а затем, используя ios_base::setf(), изменить форматирование с плавающей запятой на научное, что приведет к удалению любого конечные нули от числа с плавающей запятой (вам просто нужно обрезать показатель до конца)?

...