便携式打印指数的双C++ iostreams

Man*_*uel 15 c++ double formatting iostream platform-independent

我想打印一个double值来std::cout移植(GCC,clang,MSVC++),这样所有平台上的输出都是一样的.

我对指数的格式有问题.以下程序

#include <iostream>
int main()
{
    std::cout << 0.1e-7 << std::endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这个输出与GCC一起:

1e-08
Run Code Online (Sandbox Code Playgroud)

以及MSVC的以下输出

1e-008
Run Code Online (Sandbox Code Playgroud)

如何使两个输出相同?

如果这是一个愚蠢的问题,我很抱歉,但到目前为止我还没有找到答案.所有格式似乎围绕尾数之前的所有格式化...

编辑:GCC的输出是1e-08不是1e-8(原先规定),所以它符合.对困惑感到抱歉.

EDIT2:在Dietmar的评论之后,实际上将"尾数"重命名为"指数".维基百科上还有一节关于尾数与重要的部分.

Die*_*ühl 11

没有操纵器控制指数的格式化(我假设你的意思是指数而不是尾数;而且,用于尾数的"官方"名称是重要的).更糟糕的是,我在C标准中看不到任何限制指数格式的规则.我意识到这是关于C++的,但出于格式化细节的目的,C++标准指的是C标准.

我所知道的唯一方法是使用自己的std::num_put<char>方面,根据需要格式化值.然后将这个方面放入std::locale其中,然后将其imbue()编入std::cout.潜在的实现可以使用默认std::num_put<char>方面(或者snprintf(),遗憾的是,可能更简单)来格式化浮点数,然后从指数中去除前导零.

  • C++格式是用`printf`定义的,它表示"指数应始终包含至少两位数".(所以g ++不符合.)我正在阅读Posix标准,这应该符合C标准.但我确实对文本的模糊记忆说,除非必要,否则它不能超过两个字符(这也会使VC错误); 我记得很久很久以前就已经讨论了这个问题,并确定VC不符合要求(如果你必须使用这个编译器就不能解决问题). (4认同)