Как преобразовать float или double в строку, представленную в нестандартной базе - PullRequest
0 голосов
/ 07 марта 2020
#include <iostream>
#include <sstream>

using namespace std; 
main()
{
  float input = FLT_MAX;

  std::ostringstream buff;
  buff.precision(39);
  buff << input;
  cout << buff.str();   

}

Как преобразовать число с плавающей запятой или двойное в число в базе, отличное от десятичного? Я бы хотел express число в этих базах: 2; 4; 8; 16; 32; 64.

Но даже использования unsigned long long int недостаточно, поскольку он не может хранить числа с таким высоким показателем степени.

Есть идеи?

Редактировать: Я также хотел бы преобразовать DBL_MAX, так как я работаю над программой, которая должна находить и отображать ограничения основных типов данных c.

Этот код завершается ошибкой на второй итерации:

#include <iostream>
#include <math.h>

using namespace std; 
main()
{
  float input = FLT_MAX;
  cout.precision(39); 

  while (floor(input) != 0)
  {
    cout << input << endl;
    input /= 10;
  }

}

Может кто-нибудь придумать другой способ, кроме использования арифметики произвольной точности?

1 Ответ

0 голосов
/ 07 марта 2020

Я не тестировал программу, но думаю, что все должно быть в порядке:

#include <iostream>
#include <algorithm>

char GetChar(int num)
{
    if (num <= 9) return '0' + num;
    return 'A' + num - 10;
}

int main()
{
    int base; std::cin >> base;
    double d;
    std::cin >> d;

    auto i = (long long)d;
    d -= i;

    std::string res;

    while (i)
        res += GetChar(i % base), i /= base;

    std::reverse(res.begin(), res.end());
    res += '.';

    // to stop in case of a repeating fraction.
    int MaximumPrecision = 30;

    do
    {
        d *= base;
        i = (long long)d;
        d -= i;
        res += GetChar(i);

    } while (d > 0 && MaximumPrecision--);

    std::cout << res;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...