在C++中转储十六进制浮点数

7

我尝试了以下操作:

std::cout << std::hex << 17.0625;

但是它以十进制形式输出。我想看到11.01(十六进制为17.0625)。我应该如何以十六进制打印浮点数值?
请勿提供以下解决方案:
void outhexdigits(std::ostream& out, fp_t d, int max_chars=160)
{
    while(d > 0. && max_chars)
    {
        while(d < 1. && max_chars){
            out << '0';
            --max_chars;
            d*=16;
        }

        if (d>=1. && max_chars) {
            int i = 0;
            while (d>=1.)
                ++i, --d;
            out << std::hex << i;
            --max_chars;
        }
    }
}

在STL/boost中有没有一种将浮点数以十六进制形式转储的方法?


说实话,我觉得在输出格式化表单时,C++ 很烦人。在这种情况下,我使用 C 风格的格式化打印。 - Xephon
1
你想要获取一个 double 类型的内存布局的十六进制表示,还是想要以十六进制打印可读的浮点数值? - Matteo Italia
5
此外,std::hexfloat - BoBTFish
1
@JBL 也许你通过指针看到了类型转换?reinterpret_cast<int*>(&f); 然而,这只是未定义行为,因为存在别名规则。 - BoBTFish
@BoBTFish:你第一个给出了正确的答案,所以请把它恢复。 - Ben Voigt
显示剩余6条评论
3个回答

7

尝试使用 cout << std::hexfloat << 1.0625; 进行输出。 这需要使用C++11。


根据http://gcc.gnu.org/onlinedocs/libstdc++/manual/status.html#status.iso.2011的文档,它在GCC中尚未实现。有没有任何跨平台的类似替代品?boost::tr1? - Sergei Krivonos
在GCC 5.3上尝试过,它可以工作。但仍然无法与boost :: multiprecision一起使用。 - Sergei Krivonos

5

其他人已经提出了一个C++11的解决方案,但是您的问题没有C++11标签。这里提供一个ISO C99解决方案,使用ISO C99标准中的%a%la格式说明符。

我想看到11.01(十六进制为17.0625)。

下面的程序将打印0X1.11P+4

#include <stdio.h>

int main() {

  double x = 17.0625;

  printf("17.0625 in hexadecimal is: %A\n", x);  

}

这里有一个示例,展示了如何以十六进制格式读写浮点数。

#include <stdio.h>

int main() {

  double x = 0.1;

  char* str = "0X1.999999999999AP-4";

  printf("0.1 in hexadecimal is: %A\n", x);

  printf("Now reading %s\n", str);

  /* in a production code I would check for errors */
  sscanf(str, "%lA", &x); /* note: %lA is used! */

  printf("It equals %g\n", x);

}

如果可移植性很重要或者你被迫使用旧编译器,我认为这是一个合理的方法。


谢谢,这是一个不错的解决方案。然而,我不认为它能够与boost::multiprecision一起正常工作。在将其标记为答案之前,我会尝试一些boost::tr1的解决方案。 - Sergei Krivonos
@Sergei,我认为没有任何标准解决方案可以与boost::multiprecision一起使用。快速谷歌搜索似乎表明,在boost中尚未提供boost::multiprecision的序列化支持,但计划中。 - Ali
我本以为是P+4与P+1的关系,但显然它是按位而不是半字节计算的,这让我感到意外。 - Andrew

4

std::hexfloat 是一个格式操作器,用于以十六进制表示打印浮点数值。它自 2011 年标准以来一直存在。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接