首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++11:打印“双”作为十六进制?

C++11:打印“双”作为十六进制?
EN

Stack Overflow用户
提问于 2020-04-22 17:34:26
回答 2查看 223关注 0票数 2

我需要打印一个64位double作为十六进制字符串。

  • 我知道我必须以某种方式使用std::hexfloat。但是,在此之前,如何获得流的状态,以便将其重置为初始状态?
  • 如果目标是以尽可能高的精度打印,那么精度也必须被黑掉吗?或者这已经是六浮的一个特征了?
  • 输出必须是可以在C/C++源中使用的输出,而不需要任何进一步的操作,例如-0x123.abc42p+10

我使用的语言是C++11。不是更多,不是更少。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-04-22 18:01:39

但是,在此之前,如何获得流的状态,以便将其重置为初始状态?

您可以使用流的flags()函数检索和保存当前设置,然后使用setf()函数还原它们,确保在“掩码”中包含std::ios_base::floatfield (第二个参数)。

如果目标是以尽可能高的精度打印,那么精度也必须被黑掉吗?或者这已经是六浮的一个特征了?

是。来自优先选择

十六进制浮点格式按照std::num_put::do_put规范的要求忽略流精度规范.

下面是一个简短的演示程序,可能会有所帮助:

代码语言:javascript
复制
#include <iostream>
using std::cout; using std::endl;

int main()
{
    double test = -0x123.abc42p+10;
    cout << std::fixed;         // Change from the default for demo
    cout << test << endl;       // Display in "Current" format
    auto fSave = cout.flags();  // Save current flags
    cout << std::hexfloat;      // Change to HEX float
    cout << test << endl;       // ... and display
    cout.setf(fSave, std::ios_base::floatfield); // Restore float field
    cout << test << endl;       // Restored to previous settings!
    return 0;
}
票数 1
EN

Stack Overflow用户

发布于 2020-04-22 19:31:38

我需要它的项目实际上比C++11使用的要多一点,即GMP,它支持来自C99的打印修饰符%a

代码语言:javascript
复制
// Include cstdarg / stdarg.h prior to gmp.h in the case
// we want va_list functions like gmp_vfprintf.
#include <cstdarg>
#include <gmp.h>

void func (double d)
{
    gmp_printf ("%a", d);
}

#include <iostream>

void func (std::ostream& ost, double d)
{
    auto len = gmp_snprintf (nullptr, 0, "%a", d);
    char str[1 + len];
    gmp_sprintf (str, "%a", d);
    ost << str;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61371454

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档