在达到无穷大之前确定最大值

时间:2014-10-10 21:26:31

标签: c++

我有这个非常简单的函数来检查(N ^ N-1)^(N-2)的值:

int main() {

 // Declare Variables
 double n;
 double answer;

 // Function
 cout << "Please enter a double number >= 3: ";
 cin >> n;

 answer = pow(n,(n-1)*(n-2));
 cout << "n to the n-1) to the n-2 for doubles is " << answer << endl;
}

基于这个公式,很明显它会达到无穷大,但我很好奇,直到n的数量/值会达到无穷大?使用循环似乎效率极低,但这是我能想到的。基本上,创建一个循环,让n为1到100之间的数字,迭代直到n == inf

是否有更有效的方法解决这个问题?

2 个答案:

答案 0 :(得分:1)

我认为你正以错误的方式接近这一点。 设:F(N)是函数(N ^(N-1))(N-2)

现在你真的知道什么是可以存储在double类型变量中的最大数字 是0x 7ff0 0000 0000 0000 Double Precision

所以现在你有F(N)= max_double 现在解决X问题。 这是否回答了你的问题?

答案 1 :(得分:0)

两件事:第一件事是(N ^(N-1))^(N-2))可写为N ^((N-1)*(N-2))。因此,这会删除一个pow调用,使您的代码更快。

pow(n, (n-1)*(n-2));

第二个是要知道你遇到了什么实际限制,测试所有N只需要几分之一秒,所以没有理由找到另一种实用方法。

您可以手动计算可变大小限制和所有,但测试肯定更快。代码示例(C ++ 11,因为我使用std::isinf):

#include <iostream>
#include <cmath>
#include <iomanip>

int main() {
    double N = 1.0, diff = 10.0;
    const unsigned digits = 10;

    unsigned counter = digits;
    while ( true ) {
        double X = std::pow( N, (N-1.0) * (N-2.0) );
        if ( std::isinf(X) ) {
            --counter;
            if ( !counter ) {
                std::cout << std::setprecision(digits) << N << "\n";
                break;
            }
            N -= diff;
            diff /= 10;
        }
        N += diff;
    }
    return 0;
}

此示例在我的计算机上耗时不到一毫秒,并打印17.28894235