我正在嘗試制作一個計算這個公式的函式
#include <iostream>
#include <vector>
double Sequence(std::vector < double > & a) {
double result = 0;
for (int i = a.size() - 1; i > 0; i--) {
if (a[i] == 0) throw std::domain_error("Dividing with 0");
if (i > 1)
result = 1 / (a[i - 1] 1 / a[i]);
else result = a[i - i];
std::cout << a[i] << " " << result << " " << "\n";
}
return result;
}
int main() {
std::vector<double>a{1,2,3,4,5};
try {
std::cout << Sequence(a);
} catch (std::domain_error e) {
std::cout << e.what();
}
return 0;
}
代碼為 {1,2,3} 序列提供了正確的結果。但是,如果我在該序列中添加一些數字,結果就會出錯。你能幫我解決這個問題嗎?
uj5u.com熱心網友回復:
if (i > 1)
result = 1 / (a[i - 1] 1 / a[i]);
else result = a[i - i];
這是錯誤的;如果您有三個或更少的術語,它恰好可以作業。
你真正想要的復發是
if (i == a.size() - 1) {
result = a[i];
} else {
result = a[i] 1 / result;
}
你可以看到這是一個正確的重復,因為整理了更多的東西(從回圈內部洗掉條件,在回圈終止條件中逐一修復,并更正例外條件):
double Sequence(std::vector<double> &a) {
double result = a[a.size() - 1];
for (int i = a.size() - 1; i >= 0; i--) {
if (result == 0)
throw std::domain_error("Dividing with 0");
result = a[i] 1 / result;
}
return result;
}
uj5u.com熱心網友回復:
這被稱為簡單連分數,其中所有分子都是 1。它基本上表示為[a1;a2,a3,...,an]
(事實上從a0
但無論如何開始)。您可以從上到下計算結果,同時在每一步獲得更好的近似值(或他們所說的收斂)。
這個有限有理級數或無限無理級數的結果表示為p/q
。為了計算你假設的結果
p0 1 p1 a1 p2 a2*p1 p0 p3 a3*p2 p1 pn a_n*p_n-1 p_n-2
__ = _ and __ = __ then __ = ________ then __ = ________ .. then .. __ = _______________
q0 0 q1 1 q2 a2*q1 q0 q3 a3*q2 q1 qn a_n*q_n-1 q_n-2
并且每一個下一個都會p_x/q_x
對結果產生更好的近似值。
說如果給你一個小數,就像1.425
連分數系數一樣
[1; 2, 2, 1, 5]
又名
1
1 _____________
1
2 _________
1
2 _____
1
1 _
5
然后如上所述計算的中間收斂將是;
1 1 3 7 10 57
_ -> _ -> _ -> _ -> __ -> __ = 1.425
0 1 2 5 7 40
57/40
請注意,除了是 的最小有理運算式之外,每個收斂都隨后從最終結果上下過沖1.425
。
連分數是一個非常深奧的話題,實際上一旦在它們之間以連分數形式建立了算術,它就消除了浮點錯誤。
你可以在這里玩。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/471203.html
上一篇:數字和問題的最優解
下一篇:笛卡爾積,但洗掉重復回圈排列