nan在C++中是什么意思?为什么pow(-4,-2.1)返回-nan

What does -nan mean in C++? Why does pow(-4, -2.1) return -nan?

本文关键字:-nan 返回 pow C++ 是什么 意思 为什么 nan      更新时间:2024-04-23

在JavaScript中,当a是负数而b是非整数时,我理解为什么Math.pow(a, b)是NaN。其他编程语言也是如此。

但是,C++呢?

而在JavaScript中Math.pow(-4, -2.1)返回NaN,在C++中pow (-4, -2.1)返回-nan。为什么?


示例:

#include <iostream>
#include <math.h>
using namespace std;
int main () {
    cout << "(4)  ^ (2.1)  = " << pow (4,  -2.1) << endl; // 0.0544094
    cout << "(-4) ^ (-2.1) = " << pow (-4, -2.1) << endl; // -nan
    cout << "(-4) ^ (2.1)  = " << pow (-4,  2.1) << endl; // -nan
    return 0;
}

输出:

(4)  ^ (2.1)  = 0.0544094
(-4) ^ (-2.1) = -nan
(-4) ^ (2.1)  = -nan

我使用g++编译了代码。

$ g++ --version
g++ (Ubuntu/Linaro 4.8.1-10ubuntu9) 4.8.1
Copyright (C) 2013 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

尝试使用在线工具编译它,但显示了相同的结果:

  • http://ideone.com/4xqNU7(C++11)
  • http://ideone.com/4xqNU7(C++4.8.1)
  • http://www.compileonline.com/compile_cpp0x_online.php

我能找到的唯一相关报价来自n1570。

一个实现可能给出零和非浮点值数字(如无穷大和NaN)是一个符号,或者可以留下它们未签名。无论这些值是无符号的检索标志的国际标准应产生未指明的标志,任何设置标志的要求已忽略。

如果x是有限负的,y是有限的但不是整数值导致域错误。如果x和y都为零,也可能导致域错误。如果x为零,y为负,则可能导致域错误或极点错误(或无,取决于库实施)。如果结果太大或太小,无法用的值表示返回类型。

在您的情况下

x=-4,y=-2.1,所以x是有限负的,y是有限的,但不是整数值。现在重新阅读引用的文本;)

从这里拍摄。

EDIT:函数的域是定义函数的集合。pow期望第二个参数是integer,以防第一个参数是整数。图书馆明确表示情况确实如此。

让我这样说:

-4^-2.1 = (-1)^-2.1 * 4^-2.1

的价值应该是多少

(-1)^2.1

sqrt(-1)

对于实数是未定义的

sqrt(-1) = i

对于复数。很明显,pow的返回值是一个实数。现在无法计算

-1^-0.1

在实数集上,所以它是一个NaN(不是数字)是一个自然的数学结果,因为在这种情况下它不是实数。要想了解更多的细节,你必须学习大量的数论。