gpt4 book ai didi

c++ - 求平方根 2 收敛的分数类

转载 作者:搜寻专家 更新时间:2023-10-31 02:22:12 24 4
gpt4 key购买 nike

我做了一个可以加、乘、除分数的类,如下所示

class fraction
{
unsigned long long num, denom;

public:
fraction(int n, int d): num{n}, denom{d} {};
fraction& operator+=(fraction frac);
fraction& operator*=(fraction frac);
fraction& operator/=(fraction frac);
friend ostream& operator<<(ostream& os, const fraction& frac);
};

fraction& fraction::operator+=(fraction frac)
{
unsigned long long least_mult = lcm(denom, frac.denom); // Least-Common Multiple
num *= least_mult/denom;
num += frac.num*least_mult/frac.denom,
denom = least_mult;
return *this;
}

fraction& fraction::operator*=(fraction frac)
{
num *= frac.num;
denom *= frac.denom;
return *this;
}

fraction& fraction::operator/=(fraction frac)
{
num *= frac.denom;
denom *= frac.num;
return *this;
}

ostream& operator<<(ostream& os, const fraction& frac)
{
os << frac.num << '/' << frac.denom;
return os;
}

fraction operator+(fraction a, fraction b) {return a+=b;}
fraction operator*(fraction a, fraction b) {return a*=b;}
fraction operator/(fraction a, fraction b) {return a/=b;

}

当我尝试使用 sqrt_two = 1 + 1/(1+sqrt_two) 递归关系计算平方根二收敛时,当我达到 4478554083/3166815962 时,下一个值为 8399386631/7645270045完全不对,因为它大约是 1.098,因此所有后续值也是错误的。

int main() 
{
fraction one(1, 1), sqrt_two(3,2);

for(int i = 1; i < 50; ++i)
{
sqrt_two = one + one/(one+sqrt_two);
cout << sqrt_two << endl;
}

return 0;
}

我已经在计算器上手动尝试了 1+1/(1+8399386631/7645270045)),结果仍然是平方根收敛。

最佳答案

查看您的代码,有些行容易溢出。也许在这种情况下发生过。例如,

num += frac.num*least_mult/frac.denom,

(顺便说一下,它看起来包含错字)。

所以,我建议您看看如何 check for overflow ,然后以某种方式将其合并到您的类(class)中。不过,我不确定在这种情况下您应该怎么做。

关于c++ - 求平方根 2 收敛的分数类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30561324/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com