#include <stdio.h>
#include <math.h>
int main()
{
// ax^3 bx^2 cx d = 0
float a,b,c,d,guess,derivative;
double functional_value, accuracy;
printf("Please enter values for a,b,c,d respectively :\n");
scanf("%f %f %f %f", &a, &b, &c, &d);
printf("Please enter your best guess for a root:\n");
scanf("%f", &guess);
printf("How close you want the value to be ?\n");
scanf("%f", &accuracy);
while (fabs(functional_value) <= accuracy && derivative != 0)
{
functional_value = a*pow(guess,3) b*pow(guess,2) c*(guess) d ;
// 3ax^2 2bx c
derivative = 3*a* pow(guess,2) 2*b*(guess) c ;
guess -= ((functional_value)/(derivative)) ;
}
printf("A root of the equation is approximately equal to %f", guess);
return 0;
}
我是編程新手,我剛在大學學習 C。我想制作一個程式,可以使用牛頓法計算最多三次多項式的根。所以我寫了上面的代碼。
但是當我運行它時,回圈似乎無限運行。我什至嘗試將輸入設為 0 1 -2 1(根為 1 的二次方程),但回圈仍在運行。
我沒有注意到任何錯誤。誰能幫我找出我的錯誤?比如怎么了?
起初我沒有任何精度引數,即希望根有多接近,所以我將其添加為雙精度。
我看過一些類似的問題,但我不知道他們在 C 中使用的所有東西。
編輯#1:感謝您的評論并指出我愚蠢的語法錯誤
編輯#2:現在程式運行但它仍然不計算根。我得到以下輸出
Please enter values for a,b,c,d respectively :
0 1 -2 1
Please enter your best guess for a root:
0.5
How close you want the value to be ?
0.01
A root of the equation is approximately equal to nan
Process finished with exit code 0
編輯#3:感謝 Eric Postpichilli,現在程式在使用 fabs() 并比較功能值小于或等于準確度后確實計算了一個根。但我仍然不明白為什么會發生除以零,我在回圈條件中使用了“AND”運算子來嘗試防止這種情況發生
uj5u.com熱心網友回復:
在啟用警告的情況下編譯(使用 Clang)顯示:
- 在第 17 行,
scanf("%f", &accuracy);是錯誤的,因為%f是掃描 afloat,但是accuracy是 adouble。 - 在第 48 行,編譯器報告
guessofb*(guess,2)未使用。這是因為pow缺少預期的,所以guess,2形成了一個逗號運算子運算式,它忽略了它的左運算元。 - 在第 19 行中
while (functional_value != accuracy & derivative != 0),functional_value和derivative未初始化就使用了。
始終在啟用警告的情況下進行編譯。使用 Clang,從-Wmost. 使用 GCC,從-Wall. 使用 MSVC,從/W3.
將警告提升為錯誤。使用 Clang 和 GCC,使用-Werror. 對于 MSVC,使用/WX.
您可能希望使回圈 ado … while而不是 awhile …以便functional_value在使用之前給定一個值。但是,回圈測驗仍然是錯誤的。沒有理由期望functional_value永遠完全相等accuracy。您想要一些測驗是否functional_value至少與 . 一樣接近accuracy,例如fabs(functional_value) <= accuracy.
另外,當derivative != 0在回圈測驗中測驗時,為時已晚,因為它已經在 中使用過(functional_value)/derivative,因此將執行除以零。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/419666.html
標籤:
