如何使功能pow支持负浮点数

时间:2014-11-20 09:44:55

标签: c

我看到参数可能都是双倍的 enter image description here

但是对于像

这样的代码
   printf("%lf\n",pow(-32,0.2));
   return 0;

输出为
enter image description here
显然是错的

我已阅读 https://stackoverflow.com/questions/22583740/how-to-implement-a-pow-function-in-python-for-float-as-well-as-negative-numbers,但无法将其设为浮动负数。

那么关于如何实现支持负浮点数的pow函数的任何建议?

我知道对于pow(双x,双n),如果x为负,则执行pow(-x,n),并在返回值之前检查n
pow(-32,0.2)为例,首先我转到pow(32,0.2)并获取2,然后检查n,在这种情况下为0.2。我发现0.2,又名1/5,是一个“奇数”,所以我否定了答案然后返回-2
这是解决问题的可能方法吗?

[编辑]
我知道答案可能不是单一的,但我希望我能得到一个浮点数作为答案,如果它有一个。

3 个答案:

答案 0 :(得分:1)

负数的根源

您正在查看复数,here is a primer以及可以使用的示例实现您自己的函数 - 请查看this SO question;或者您可以切换到c ++并使用<complex>创建自己的库,可以从c。

调用

替代方案,基于评论:

如果你这样做会不起作用:

long double mypow(long double v, long double p)
{
    int sign=1;
    long double r;
    if (v<0)
    {
        sign = (-1);
        v *= sign;
    }
    r = pow(v, p);
    return (r*sign);
}

答案 1 :(得分:1)

将负数增加到非整数幂通常会导致数字帽不能表示为单个浮点数。在这个特定的情况下(-32 ** 0.2)它的答案是-2(-2 ** 5是-32),但在一般情况下你需要有一个返回复数的pow函数

答案 2 :(得分:1)

这是问题背后的一些数学:

我们有pow(x,y),其中x&lt; 0和y不是整数。

首先,让y = n+f n为整数且0<f<1。 (由n = floor(y); f=y-n;获得)

使用指数法则:

pow(x,y) = pow(x,n) * pow(x,f)

pow(x, f)(x <0)是真实的,如果y是有理数a/b(写在最小的表单上,其中ab没有具有奇数分母的共同质数除数(即,如果b是奇数)。

在这些情况下,结果可以获得:

如果pow(-x,y)是偶数,那么

a 如果-pow(-x,y)是奇数,则a

在使用分数的所有其他情况下,结果并不真实。