Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.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++ 1.#INF00、-1.#IND00和-1.#IND是什么意思?_C++_C - Fatal编程技术网

C++ 1.#INF00、-1.#IND00和-1.#IND是什么意思?

C++ 1.#INF00、-1.#IND00和-1.#IND是什么意思?,c++,c,C++,C,我在用浮点数处理一些C代码,当我尝试在屏幕上打印浮点数时,得到了1.#INF00,-1.#IND00和-1.#IND。这些价值观意味着什么 我相信1.#INF00表示正无穷大,但是-1.#IND00和-1.#IND呢?我有时也看到这个值:1.$NaN,它不是一个数字,但是是什么导致了这些奇怪的值,这些值如何帮助我进行调试 我用它来表示浮点数 有人能列出所有这些无效值及其含义吗?来自: 本页将回答以下问题 我的程序刚刚打印出1.#IND或1.#INF(在Windows上)或nan或INF(在Li

我在用浮点数处理一些C代码,当我尝试在屏幕上打印浮点数时,得到了1.#INF00,-1.#IND00和-1.#IND。这些价值观意味着什么

我相信1.#INF00表示正无穷大,但是-1.#IND00和-1.#IND呢?我有时也看到这个值:1.$NaN,它不是一个数字,但是是什么导致了这些奇怪的值,这些值如何帮助我进行调试

我用它来表示浮点数

有人能列出所有这些无效值及其含义吗?

来自:

本页将回答以下问题

  • 我的程序刚刚打印出1.#IND或1.#INF(在Windows上)或nan或INF(在Linux上)。发生了什么事
  • 我如何判断一个数是否真的是一个数,而不是一个NaN或一个无穷大
  • 我怎样才能在运行时找到有关各种“南”和“无限”的更多细节
  • 您是否有任何示例代码来说明这是如何工作的
  • 我在哪里可以学到更多
这些问题与浮点异常有关。如果您得到一些奇怪的非数字输出,而您期望的是一个数字,那么您要么超过了浮点运算的有限限制,要么要求得到一些未定义的结果。为了保持简单,我将坚持使用双浮点类型。类似的注释适用于浮动类型

调试1.#IND,1.#INF,nan和INF

如果您的操作生成的正数大于存储在double中的正数,则该操作将在Windows上返回1.#INF,在Linux上返回INF。类似地,如果结果是一个负数,太大而无法存储在double中,代码将返回-1.#INF或-INF。正数除以零产生正无穷大,负数除以零产生负无穷大。本页末尾的示例代码将演示一些产生无穷大的操作

有些运算在数学上没有意义,比如取负数的平方根。(是的,这个操作在复数的上下文中是有意义的,但是double表示实数,因此没有double表示结果。)对于负数的对数也是如此。sqrt(-1.0)和log(-1.0)都将返回一个NaN,NaN是“非数字”的“数字”的通用术语。Windows将NaN显示为-1.#IND(“IND”表示“不确定”),而Linux显示NaN。将返回NaN的其他操作包括0/0、0*∞, 及∞/∞. 有关示例,请参见下面的示例代码

简而言之,如果得到1.#INF或INF,请查找溢出或被零除。如果你得到1.#IND或nan,寻找非法操作。也许你只是有个bug。如果它更微妙,并且您有一些难以计算的内容,请参阅避免溢出、下溢和精度损失。这篇文章给出了计算结果的技巧,如果直接计算,中间步骤会溢出


对于那些在.NET环境中的人来说,以下是过滤非数字的简便方法(此示例在VB.NET中,但在C#中可能类似):

如果是Double.IsNaN(MyVariableName),那么
MyVariableName=0'或您想在此处执行的任何操作来“纠正”这种情况
如果结束
如果尝试使用具有NaN值的变量,将出现以下错误:

值对于小数来说太大或太小

上面已经回答了您的问题“它们是什么”

至于调试(您的第二个问题),在开发要检查特殊输入值的库时,您可能会发现以下函数在Windows C++中很有用:

_isnan()、_isfinite()和_fpclass()等


在Linux/Unix上,您应该会发现isnan()、isfinite()、isnormal()、isinf()、FpClassification()非常有用(并且您可能需要使用编译器标志-lm链接libm)。

对于任何想知道
-1.#IND00
-1.#IND
之间区别的人来说(问题特别提出了这个问题,但没有答案):

-1.#IND00

这特别意味着非零数字除以零,例如
3.14/0
()

-1.#IND
(NaN的同义词)

这意味着四件事之一(请参见):

1) 负数的
sqrt
log

2) 两个变量均为0或无穷大的操作,例如
0/0

3) 至少一个变量已经是
NaN
的操作,例如
NaN*5


< p>4)超出范围TRIG,例如“代码> ARCISN(2)< /P> >我知道OP并没有真正要求这个,但是作为一个方便的测试,<代码> MyFoals= MyFooS/<代码>如果你有这些魔法值,它将返回false。@ TcPN实际上是C++,+无穷大== +无穷大。尝试检查1.0/0.0:
1.#INF00
=
1.#INF00
返回true,
-1.#INF00
=
-1.#INF00
返回true,但
1.#INF00
=
-1.#INF00
为false。不确定其他配置,但在Windows 7/Visual studio 2010上。浮点数nan=sqrtf(-1.0f);nan==nan;//计算结果为真。。。与滕普所说的相反。。(Yevgen V的评论)如果你能使用C++11,看看等等。如果你能使用Boost,你就是@Jeff,这可能与优化有关。请参阅。这不会检测到
1.#INF
。您还需要使用
Double.IsInfinity(MyVariableName)
检查+/-无穷大。这是Microsoft C运行时库格式化无穷大和NaN浮点值的方式。MinGW没有自己的CRT,它使用操作系统提供的msvcrt.dll。它的确切外观取决于您使用的printf()格式说明符,因此额外的零甚至可以。C99标准设定了VS2015中采用的预期输出,因此