Recursion C++&引用;“双”字;变量过早溢出

Recursion C++&引用;“双”字;变量过早溢出,recursion,double,overflow,factorial,Recursion,Double,Overflow,Factorial,我已经写了一个简单的代码来测试我的新计算机上的编译器是否正常工作。编译/构建项目没有问题。这个程序应该通过递归计算阶乘,它工作得很好,但只在13以下!(只有大约x*10^9,双精度的范围应达到x*10^308)。如果我尝试更高的数字,它会给我负面的结果,等等。我无法找出问题的原因。在我的旧电脑(32位WinXP)上,同样的代码可以正常工作到170!(但我不确定是否完全相同,因为我的主要数据已经丢失)。我应该重新安装编译器还是设置有问题?还是我的代码不正确 我现在的电脑有64位win7和AMD处理

我已经写了一个简单的代码来测试我的新计算机上的编译器是否正常工作。编译/构建项目没有问题。这个程序应该通过递归计算阶乘,它工作得很好,但只在13以下!(只有大约x*10^9,双精度的范围应达到x*10^308)。如果我尝试更高的数字,它会给我负面的结果,等等。我无法找出问题的原因。在我的旧电脑(32位WinXP)上,同样的代码可以正常工作到170!(但我不确定是否完全相同,因为我的主要数据已经丢失)。我应该重新安装编译器还是设置有问题?还是我的代码不正确

我现在的电脑有64位win7和AMD处理器。我现在正在使用MS Visual Studio 2012更新2

我是C++新手,也为我的英语不好而抱歉。 这是我的密码:

    #include <iostream>

    using namespace std;

    int factorial(int x){
        if (x==2){ return 2;}
        return x*factorial(x-1);
    }

    int main()
    {
        double x,v;
        cout<<"insert number: ";
        cin>>x;
        v=factorial(x);
        cout<<"\n"<<v<<"\n";
        system("pause");
        return 0;
    }
#包括
使用名称空间std;
整数阶乘(整数x){
如果(x==2){返回2;}
返回x*阶乘(x-1);
}
int main()
{
双x,v;
coutx;
v=阶乘(x);
难道不应该是:

double factorial(double x)
否则它会将您的数字转换为整数并溢出


编辑:您是否禁用了警告?我认为阶乘(x)调用应该发出关于丢失精度的警告…

是的,当然。谢谢。我觉得自己很傻,因为这确实是一个基本错误,我没有注意到。。。