什么样的C++常量/宏是-1.#IND
What kind of C++ constant/macro is -1.#IND?
数学"pow"函数返回-1.#IND。-1.#IND 是什么样的错误值,如何检测 if 语句中的错误?
-1.#IND
是 Windows 上 NaN 的文本表示。
您可以使用以下小函数检查浮点值是否为 NaN:
// NaN never compares equal, not even to itself
bool is_nan(double d){ return d != d; }
(正如@chris所指出的,如果你有一个符合 C++11 标准的 stdlib,你会得到std::isnan
<cmath>
。
在正常的程序流程中,只要您理智地检查您的数学输入,就不需要担心 NaN。当然,你也可以走另一条路,只是做你的数学计算,然后检查NaN。:)
您看到的值是 NaN 的表示形式,而不是数字。这些值显示为具有未定义值的浮点运算的结果。例如,0.0 / 0.0
将产生 NaN。在许多其他情况下会产生 NaN。如果要确定浮点值是否为 NaN,可以测试它们:
if (std::isnan(value)) {
...
}
由于浮点运算,很少有其他特殊值可以产生,例如,正无穷大或负无穷大,并且在<cmath>
中也有针对这些值的测试。
-1#IND 通常发生在代码中的某个位置有/0 时。 通过检查 pow 函数中的所有分母或基数来防止它,并带有 0 的 -ve 指数。
除法或 pow 操作完成后,如果您没有检查输入,请使用以下命令检查输出:
if (output != output) return 0; // or some default
else return output;
-1.#IND
是一个NaN,而不是一个数字。NaN的出现有很多原因。0.0/0.0 等表达式是不确定的;如果你尝试,你会得到一个 NaN。-1(或任何负实数)的平方根是纯虚数;使用浮点或双sqrt
函数,您将获得 NaN。这里的结果不是不确定的,但也不是真实的。这是一个 NaN。
表达sqrt(-1.0)
的另一种方式是pow(-1.0, 0.5)
。这也会产生一个 NaN。
相关文章:
- enum是C++中的宏变量还是整数变量
- 当无法使用模板和宏时,生成类型变体C++代码的最简单方法是什么?
- 在使用包含冒号的类似函数的宏时,是什么导致了这种编译器差异?
- 在 eclipse 中,将宏重定义视为错误而不是警告
- 将一个宏传递到另一个宏而不是直接传递内容时会出现不需要的额外"空"参数
- 解释一下这个宏是如何工作的?[C 中的打印var名称]
- 为什么预处理宏是邪恶的,还有什么选择
- 什么样的C++常量/宏是-1.#IND
- 这个宏是什么意思?#define 未使用(x) ((x)=(x))
- 像 #define DCL_PROP(prop)这样的宏是如何工作的
- 宏是强制内联的唯一方法吗?
- 这个宏是如何工作的
- 在代码中修改预处理器宏是一种好的风格吗
- C++函数或类之前的宏是什么?
- 使用宏是为了为可变模板实例化提供typedef,这是使用宏的正当理由
- (C++/WP8)为 WP8 平台定义的平台宏是什么?
- __glibcxx_function_requires和__glibcxx_requires_valid_range宏是
- 这个c++模板宏是什么意思?
- 带循环的宏是如何在C/C++中实际工作的
- 用静态常量变量替换宏是值得怀疑的