Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何让所有平台编译器为NaN输出相同的字符串?_C++_Nan_Ostream - Fatal编程技术网

C++ 如何让所有平台编译器为NaN输出相同的字符串?

C++ 如何让所有平台编译器为NaN输出相同的字符串?,c++,nan,ostream,C++,Nan,Ostream,考虑以下代码片段: #include <iostream> #include <string> #include <limits> int main() { std::cout << std::numeric_limits<double>::quiet_NaN(); } #包括 #包括 #包括 int main() { std::cout只需对quiet\u NaN值执行您自己的检查,并基于该值进行打印。使用isnan()可

考虑以下代码片段:

#include <iostream>
#include <string>
#include <limits>

int main()
{
    std::cout << std::numeric_limits<double>::quiet_NaN();
}
#包括
#包括
#包括
int main()
{

std::cout只需对
quiet\u NaN
值执行您自己的检查,并基于该值进行打印。

使用
isnan
()可移植地测试
双精度
是否为NaN

#include <cmath>

// ...

double d;

if (isnan(d))
   // ...
#包括
// ...
双d;
if(isnan(d))
// ...
  • 从导出您的
    YourNumPut
  • 覆盖您需要的内容,例如:
    virtualiter\u type do\u put(iter\u type out,std::ios\u base&str,char\u type fill,double v)const;
  • 创建使用它的区域设置:
    std::locale yourlocate(std::locale(),new YourNumPut());
  • 将其设置为全局、imbue
    cout
    cerr
    或您需要的位置:
    std::locale::global(yourLocale);std::cout.imbue(yourLocale);std::cerr.imbue(yourLocale);

  • 测试一下

  • 利润;)

您可以使用流操纵器或修改基础区域设置:

操纵器:

#include <cmath>
#include <ostream>

template <typename T>
struct FloatFormat
{
    const T value;

    FloatFormat(const T& value)
    : value(value)
    {}

    void write(std::ostream& stream) const {
        if(std::isnan(value))
            stream << "Not a Number";
        else
            stream << value;
    }
};

template <typename T>
inline FloatFormat<T> float_format(const T& value) {
    return FloatFormat<T>(value);
}

template <typename T>
inline std::ostream& operator << (std::ostream& stream, const FloatFormat<T>& value) {
    value.write(stream);
    return stream;
}

int main() {
    std::cout << float_format(std::numeric_limits<double>::quiet_NaN()) << '\n';

}
#包括
#包括
模板
结构浮动格式
{
常数T值;
浮动格式(常量T和值)
:值(value)
{}
空写(std::ostream&stream)常量{
如果(标准::isnan(值))

stream在C++20中,您可以使用来执行以下操作:

std::cout << std::format("{}", std::numeric_limits<double>::quiet_NaN());

std::我是否需要两者都产生相同的输出。对我来说,听起来像是一个XY问题……数字的输出最终调用,基本上用于格式化输出。正如参考页所说,NaN的输出应该是
NaN
NaN(字符序列)
(哪一个是实现定义的)这意味着Visual Studio是错误的。这也意味着,即使对于兼容的编译器和库,您也有两种可选的输出需要处理。因此,问题可能是如何强制VS2010输出“nan”而不是“1.#QNAN”…不要说VS2015遵循标准并输出“nan”,这没关系。但你不能只使用
==quiet\u NaN
,因为NaN永远不会与任何东西相比(即使是他们自己)。这是它们更有趣的属性之一。@MarkRansom:你可以使用
isnan
@jpo38。我知道。我一直在催促你得到一个更好的答案。@MarkRansom:你知道,你可以编辑我的答案,使其更好;)我认为你的ostream属性基本上是可行的;毕竟,你想做的是修改一个问题的具体程度重新打印。我知道如何测试一个数字是否为nan,但是,显然,对于一个在许多地方数字重定向到输出和文件的大型项目,到处添加测试将是一件痛苦的事情。我正在寻找一个全局解决方案(要么修改
std::locale
或者当前使用的
ostream
属性)。我试过了,但想不出如何在
do\u put
重载方法中将字符串(如“nan”)发送到输出流中……请发布一个编译示例好吗?只需std::copy to out参数。谢谢!这正是我要找的!
std::cout << std::format("{}", std::numeric_limits<double>::quiet_NaN());