我做了一個程式,用高斯-喬丹消除法解決線性方程。該程式作業正常,但在某些情況下,它沒有給出0的答案,而是回傳一個非常小的值。
#include<iostream>
#include<ioomanip>
#include<cassert>
#define N 10
using namespace std;
//printing out the array
void print(float x[][N], int n)>{
for(int i=0;i<n; i ){
for(int j=0;j<=n;j )
cout << setprecision(5) << setw(15) << x[i][j] 。
cout <<endl;
}
cout <<endl;
}
//將前導項規范化為1。
void normalize(float x[][N] 。int n, int i, int j){
float fac = x[i][j];
for(int k=0; k<=n;k )
x[i][k] /= fac;
}
//check if the leading entry is a zero[/span]。
bool chk_zero(float x[][N] 。int n, int i){
int j, k, c{0};
if(x[i][i]==0){
for(j=i;j<n-1; j ){
c=1;
while(x[j c][i]==0 && i c<n){
c ;
if(i c==n-1)
assert(i c==n-1 && "方程無解") 。
return false;
}
for(k=0;k<=n;k ){
swap(x[i][k], x[i c][k])。
}
return true。
}
}
return true;
}
/Gauss Jordan elimination method; }
void GaussJordan(float x[][N], int n){
int i, j, k, c;
float rat。
for(i=0;i<n;i ){
//not taking the zero in pivot column case。
chk_zero(x, n, i)。
normalize(x, n, i, i)。
for(j=0; j<n; j ){
if (i != j){
float fac{x[j][i]};
for(k=0; k<=n; k )
x[j][k] = x[j][k]-fac*x[i][k]。
}
}
}
}
int main(){
float arr[][N] = { {0, 5, 1, 2},
{2, 11, 5, 3},
{1, 0, 0, 0}. };
int n = sizeof(arr)/sizeof(arr[0] )。)
print(arr, n)。
GaussJordan(arr, n)。
cout << n << endl;
print(arr, n)。
return 0。
我得到的輸出是:
1 0 0 2.3842e-08
0 1 0 0.5
-0 -0 1 -0.
我應該得到的輸出是:
。 1 0 0 0
0 1 0 0.
-0 -0 1 -0.
數值2.3842e-08應該是一個零。是不是因為C 中浮點的精度問題?
如果是這樣,我應該怎么做才能在不損失資料的情況下將如此低的數值四舍五入為0呢?
另外,為什么會有一個"-0 "而不是一個0呢?
uj5u.com熱心網友回復:
數值2.3842e-08應該是一個0。這是因為C 中浮點的精度問題嗎?
是的,是的。
如果是這樣,我應該怎么做才能在不損失資料的情況下將如此低的數值四舍五入到0?
你可以使用一個epsilon值來決定一個浮點數值是否被認為是0:
const float epsilon = 0.000001; //取決于您應用程式的用例。
if (std::abs(some_float) < epsilon) {
//將some_float視為0。
然而,這種方法有一些缺點。請閱讀這里了解更多。
另外,為什么會有一個"-0 "而不是一個0呢?
這是因為浮點數的表示方法。大多數C 編譯器使用IEEE 754標準來實作浮點算術。
要補充的幾件事(與問題無關):
- 你應該避免使用
使用命名空間std,因為它污染了全域命名空間。特別是對于大型代碼庫。 - 使用
std::array<>而不是原始陣列,因為它們更安全。
uj5u.com熱心網友回復:
值2.3842e-08應該是一個零。 這是因為C 中浮點的精度問題嗎?
不是。
不,這是根據IEEE-754標準在二進制數字系統中浮點數字表示的一個特征。它在硬體中實作,并被幾乎所有的語言所使用。所有的浮點計算都是帶錯誤的,所以你應該為FPU設定正確的舍入模式。詳情見<fenv.h>
。轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/306746.html
標籤:
