Форум программистов, компьютерный форум CyberForum.ru

Количество цифр в вещественном (!) числе - C++

Войти
Регистрация
Восстановить пароль
 
mymedia
190 / 190 / 48
Регистрация: 27.05.2011
Сообщений: 543
16.05.2014, 20:51     Количество цифр в вещественном (!) числе #1
Всем привет!
Пытаюсь решить такую задачу, но для дробных чисел ничего не получается С целыми числами всё норм.
Нужно посчитать к-во цифр в данном числе (тип double). Если число дробное, десятичную зяпятую не считать. Если число неотрицательное, знак не считать.
Вариант 1
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
template<class T>
int getLendth(T num)
{
    using namespace std;
    T full; // целая часть
    T fract = modf(num, &full); // дробная часть
 
    const int full_count = floor(log10(full))+1;    // к-во цифр в целой части
 
// ***
    int exp;
    T mant2 = frexp(fract, &exp);   // ДВОИЧНАЯ МАНТИССА
    const int fract_count = mant2/fract * pow(2,exp);   // к-во цифр в дробной части
// ***
 
    const int sign_count = num >= 0 ? 0 : 1;    // есть ли знак
    return full_count+fract_count+sign_count;
}

Вариант 2
C++
1
2
3
4
5
6
7
8
9
10
template<class T>
int getLendth(T num)
{
    using namespace std;
    stringstream s_stream;
    string s_string;
    s_stream << num;
    s_stream >> s_string;
    return s_string.size() - ( ceil(num)-floor(num) ? 1 : 0 );  
}

В принципе, меня вполне устраивает второй вариант, но если в числе более шести цифр, то число записывается в экпоненциальном ввиде, а как это отключить, я не знаю. Есть манипулятор scientific, который принудительно включает экспоненциальный формат вывода, но почему-то нет обратного
P.S.: в обоих случаях шаблоны инстанцируются с T = double

Добавлено через 5 минут
Помогите, пожалуйста!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.05.2014, 20:51     Количество цифр в вещественном (!) числе
Посмотрите здесь:

Количество различных цифр в числе C++
C++ определить количество чётных цифр в числе
C++ Определить количество цифр в числе N
C++ Считать количество цифр в числе
C++ Подсчитать количество цифр 5 в числе
Узнать количество цифр в числе C++
Подсчитать количество цифр после запятой в вещественном числе C++
Количество цифр в числе C++
Количество различных цифр в числе C++
В вещественном числе определить, равны ли суммы цифр целой и дробной части C++
C++ Определить количество значимых цифр в вещественном числе со знаком
C++ Подсчет количества цифр в вещественном числе

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Vandris
 Аватар для Vandris
63 / 63 / 13
Регистрация: 19.01.2011
Сообщений: 90
16.05.2014, 22:56     Количество цифр в вещественном (!) числе #2
Цитата Сообщение от mymedia Посмотреть сообщение
но почему-то нет обратного
Ну как же нет, если есть?) Только забегая вперед, скажу что он Вам не всегда поможет
C++
1
2
3
4
5
6
7
double test = 1.0 / 1000000000.0;
 
std::cout << test << "\n";                    // 1e-009
std::cout.setf(std::ios::fixed);              
std::cout << test << "\n";                    // 0.000000
std::cout.unsetf(std::ios::fixed);
std::cout << test << "\n";                    // 1e-009
Выводимое количество знаков после запятой регулируется так:
C++
1
2
std::cout.setf(std::ios::fixed);
std::cout << std::setprecision(9) << test << "\n";           //0.000000001
Но такой трюк сработает не со всеми числами. Дело в том, что тип double хранит 15-17 значащих цифр (видимо дело в двоичном представлении числа и его округлении). Причем не важно, до запятой или после.

C++
1
2
3
4
double test = 10000000000.111111;
 
std::cout.setf(std::ios::fixed);
std::cout << std::setprecision(9) << test << "\n";      // 10000000000.1111110687
Так что, я бы на Вашем месте наверно умножал на 10 до тех пор, пока 15 цифр не окажутся до запятой, потом взять целую часть, убрать лишние нули в конце, и уже тогда считать цифры.
Yandex
Объявления
16.05.2014, 22:56     Количество цифр в вещественном (!) числе
Ответ Создать тему
Опции темы

Текущее время: 11:41. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru