【问题标题】:Find nth Root of a number in C++ [duplicate]在C ++中查找数字的第n个根[重复]
【发布时间】:2014-02-04 03:49:48
【问题描述】:

我正在尝试创建一个数学库,其中一个函数找到了浮点数的第 n 个根。

我现在的表情是——

value = value ^ 1/rootValue

但我收到错误,因为我使用的是浮点数。 有没有其他方法可以解决这个问题?

【问题讨论】:

  • @MarcB:这对于找到函数的根很好,但问题是关于找到数字的根。
  • @mikea:不是这样。除非您从头开始将其作为学习练习来实现,否则您会在适当的时候使用标准库。
  • @MikeSeymour 这种模棱两可的原因很简单。 N数的根K 是函数f(x) = x^N - K 的根。
  • @ŁukaszKidziński:确实;如果您想从(或多或少)第一原则解决这个问题,一般的寻根算法可能会很有用。但是对于这种特殊情况,有more specific algorithms,如果这不是学习数字技术的练习,还有标准库。

标签: c++ math


【解决方案1】:

C++ 中没有“幂”运算符; ^ 是按位异或运算符,仅适用于整数。

相反,标准库中有一个函数:

#include <cmath>

value = std::pow(value, 1.0/root);

【讨论】:

    【解决方案2】:

    ^ 不是你想要的。它是按位异或运算符。

    使用

    #include <math.h>
    

    然后

    value = pow(value, 1/rootvalue)
    

    pow的参考:http://www.cplusplus.com/reference/cmath/pow/

    【讨论】:

      【解决方案3】:

      ^ 运算符不会按照您的想法执行 - 它不是幂运算符,而是按位异或。

      查看math 库中的pow

      【讨论】:

        【解决方案4】:

        根据wikipage

        #include <iostream>
        
        using namespace std;
        double exp(double, double);
        double n_root_(double, double);
        int main()
        {
            double v = n_root_(27,3);
            cout << v << endl;
            return 0;
        }
        
        double exp(double a, double b){
            double t(1);
            for(int i = 0;i<b;++i)
                t *= a;
            return t;
        }
        double n_root_(double num, double n_){
            double x;
            double A(num);
            double dx;
            double eps(10e-6);
            double n(n_);
            x = A * 0.5;
            dx = (A/exp(x,n-1)-x)/n;
            while(dx >= eps || dx <= -eps){
                x = x + dx;
                dx = (A/exp(x,n-1)-x)/n;
            }
           return x;
        }
        

        【讨论】:

        • double exp(double a, double b) 多么可怕的无用函数签名!
        • 这是使用pow(x, 1/root) 的有效替代方案吗?
        【解决方案5】:

        ^按位异或 运算符。 使用 pow() 函数。

        【讨论】:

          猜你喜欢
          • 2012-01-07
          • 1970-01-01
          • 2015-08-05
          • 1970-01-01
          • 2011-08-29
          • 1970-01-01
          • 2023-03-10
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多