Gram Schmidt实现部分工作,输出一个坏数字

时间:2018-03-20 12:05:53

标签: c++

我正在尝试在学校项目的代码中实施Gram Schmidt而且我有一个问题。它输出一个奇怪的数字,我不知道为什么。其余的都很好但是这个很糟糕。如果帖子很糟糕,但这是我在这里的第一篇帖子,我真的需要帮助。谢谢

package com.example.admin_u5214628.magiceight;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.TextSwitcher;
import android.widget.Toast;

import java.util.Random;

public class MainActivity extends AppCompatActivity {
    Random r = new Random();
    static final String messages[] = {"Yes", "I would think so", "It is so", "No", "Not a chance", "Never",  "maybe", "I would rather not say"};
    TextSwitcher switcher;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        switcher = (TextSwitcher) findViewById(R.id.textSwitcher);
    }

    void answer(View v) {
        String message = messages[r.nextInt(messages.length)];

        switcher.setText(message);
    }

}

输出:

#include <iostream>
#define dim 100

using namespace std;



void inputMatrix(int *n, int *m, double x[dim][dim]){
    int i,j;
    for(i = 0; i < *n; i++){
        cout << "V" << i << ":";
        for(j = 0; j < *m; j++)
            cin >> x[i][j];
    }

}

void outputMatrix(int *n, int *m, double x[dim][dim]){
    int i,j;
    for(i=0;i<*n;i++){
        for(j=0;j<*m;j++)
            cout<<x[i][j]<<"  ";
        cout<<endl;
    }
}
void initialize(int *m,double v[dim]){
    int i;
    for(i=0;i<*m;i++){
         v[i]=0;
    }    
}
int main(){
    double v[dim][dim], f[dim][dim], e[dim][dim],p1,p2,a[dim];
    int n,m,i,j,z;
    cout << "Introduceti numarul de vectori: ";cin >> n;
    cout << "Introduceti numarul de elemente: ";cin >> m;
    inputMatrix(&n,&m,v);
    double div = 0;
    for(i = 0; i < m; i++){
        f[0][i] = v[0][i];
    }
    outputMatrix(&n,&m,v);
    cout << endl;
    outputMatrix(&n,&m,f);
    for(i = 1;i < n; i++){
        z = 0;
        initialize(&m,a);
        mk1:
        p1 = 0;
        p2 = 0;
        for(j = 0; j < m; j++){
            p1 = f[z][j] * v[i][j] + p1;
            p2 = f[z][j] * f[z][j] + p2;
        }
        div = p1 / p2;
        for(j = 0; j < m; j++){
            a[j] = f[z][j] * div + a[j];
        }
        z++;
        if( z < i){
            goto mk1;
        }
        else{
            for(j = 0; j < m;j++){
                f[i][j] = v[i][j] - a[j];
            }
        }
    cout << endl;
    outputMatrix(&n,&m,f);
    return 0;
}

我不明白为什么输出这个“5.55112e-17” 谢谢你的帮助!

2 个答案:

答案 0 :(得分:2)

  

我不明白为什么输出这个“5.55112e-17”感谢您的帮助!

这是舍入误差的结果,这种表示法意味着5.55112乘以10的幂,并且可以被认为是用(实数)计算机表示计算的伪像。有关详细说明,请考虑this回答。

答案 1 :(得分:2)

5.55112e-17非常接近于零。由于您使用的数字二进制表示的数值分辨率(例如double),它并不完全为零。

您可以使用更高的分辨率进行计算,而不是打印结果。 或者,您可以在最后进行舍入。然而,你无法摆脱数字。

这里有一些关于你的代码的其他评论:

  • 请使用适当的容器,std::vector。这也使您可以使用动态内存分配(如果矩阵大于100,您的代码将崩溃)。
  • 请不要使用goto。您可以在下面找到另一种实现方式。
  • 将指向整数的函数指向函数是没有意义的。你不能从中获得任何东西,但可读性会降低。

没有goto的代码

int main() {
    double v[dim][dim], f[dim][dim], e[dim][dim], p1, p2, a[dim];
    int n, m, i, j, z;
    cout << "Introduceti numarul de vectori: ";
    cin >> n;
    cout << "Introduceti numarul de elemente: ";
    cin >> m;
    inputMatrix(&n, &m, v);
    double div = 0;
    for (i = 0; i < m; i++) {
        f[0][i] = v[0][i];
    }
    outputMatrix(&n, &m, v);
    cout << endl;
    outputMatrix(&n, &m, f);
    for (i = 1; i < n; i++) {
        z = 0;
        initialize(&m, a);
        do {
            p1 = 0;
            p2 = 0;
            for (j = 0; j < m; j++) {
                p1 = f[z][j] * v[i][j] + p1;
                p2 = f[z][j] * f[z][j] + p2;
            }
            div = p1 / p2;
            for (j = 0; j < m; j++) {
                a[j] = f[z][j] * div + a[j];
            }
            z++;
        } while (z < i);
        for (j = 0; j < m; j++) {
            f[i][j] = v[i][j] - a[j];
        }
    }
    cout << endl;
    outputMatrix(&n, &m, f);
    return 0;
}