【问题标题】:How to make function pow support negative float number如何使函数 pow 支持负浮点数
【发布时间】:2015-01-18 02:52:03
【问题描述】:

我看到参数可能都是双精度的

但是对于像

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

输出是

明显错误

我已经阅读了https://stackoverflow.com/questions/22583740/how-to-implement-a-pow-function-in-python-for-float-as-well-as-negative-numbers,但它不能用于浮点负数。

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

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

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

【问题讨论】:

  • pow(1.0, n) 是所有n1。如果n 是偶数,pow(-1.0, n) 将是1,如果n 是奇数,则-1。您希望pow(-1.0, 0.5) 的结果是什么? 提示:结果必须是复数,而复数不能用浮点数表示。
  • 0.2 怎么奇怪?将其除以 2 后,您会得到一个余数,这就是“奇数”的定义,但据此估计 所有 分数都是奇数。可以是“真”、“假”(如果是,请提供反例)或“未定义”的陈述,因为“偶数”和“奇数”数的推理完全依赖于自然数。
  • @Klas Lindbäck 我可以为这种情况抛出一个错误。这不是我的问题的重点。
  • 我认为 0.2 在这种情况下被认为是奇数,因为它是一个“奇数”根,即第五个根。 0.5 将被视为偶数,即第二个(平方)根。奇数根不会导致复数。

标签: c


【解决方案1】:

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

我们有pow(x,y),其中 x

首先,设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) (xy 是一个有理数 a/b(写成最小形式,其中ab 没有公约数)且分母为奇数(即是,如果b 是奇数)。

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

pow(-x,y) 如果a 是偶数并且 -pow(-x,y) 如果a 是奇数

在所有其他带有分数的情况下,结果都是不真实的。

【讨论】:

    【解决方案2】:

    负数的根

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

    替代方案,基于 cmets:

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

    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);
    }
    

    【讨论】:

    • 我认为 OP 希望支持实际结果为实数的情况。对于 OP 问题中的示例,pow(-32,0.2) 应该产生 -2,因此这里不需要复数。
    【解决方案3】:

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

    【讨论】:

    • 我希望如果它确实有一个浮点根然后返回这个根,如果只存在复杂的根然后抛出一个错误或返回 null
    • 如果这真的是你想要的,你最好用float nth_root(float n, int nth)
    猜你喜欢
    • 1970-01-01
    • 2022-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-08
    • 1970-01-01
    • 2018-09-08
    相关资源
    最近更新 更多