【问题标题】:How to convert float or double to string represented in non-standard base如何将浮点数或双精度数转换为以非标准基数表示的字符串
【发布时间】:2020-06-19 23:33:57
【问题描述】:
#include <iostream>
#include <sstream>

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

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

}

如何将浮点数或双精度数转换为十进制以外的基数? 我想以这些基数表示数字:2; 4; 8个; 16; 32; 64.

但即使使用 unsigned long long int 也是不够的,因为它无法存储如此高指数的数字。

有什么想法吗?

编辑: 我也想转换 DBL_MAX,因为我正在开发一个应该查找和显示基本数据类型限制的程序。

此代码在第二次迭代时失败:

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

}

除了使用任意精度算术之外,谁能想到其他方法?

【问题讨论】:

  • 标准流不对浮点数 IIRC 执行此操作。您必须自己将它们转换为字符串。
  • 以什么形式打印?符号、分数和指数?
  • 十进制,可能带有指数,例如0.333333333333̅₍₁₀₎ = 0.1₍₃₎,或 1e-1₍₃₎(想不出二进制或其他列出的系统中的示例)
  • 做好这件事真的很难。人们获得研究这种东西的博士学位。做一个半途而废的工作相当容易,如果这足够好,你在这里得到的答案可能会奏效。

标签: c++ string numbers


【解决方案1】:

我没有测试程序,但我认为这应该没问题:

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

【讨论】:

  • 谢谢,但这不适用于 d = DBL_MAX,这对我来说很重要,因为我正在开发一个应该显示每种基本数据类型限制的程序。跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-06-16
  • 1970-01-01
  • 2017-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-12
相关资源
最近更新 更多