Арифметические Операции С Элементами Массива

Тема в разделе "Общие вопросы по С и С++", создана пользователем PetrovichVMF, 15 сен 2014.

  1. PetrovichVMF

    PetrovichVMF Member

    Регистрация:
    26 авг 2014
    Сообщения:
    10
    Симпатии:
    0
    Добрый день!
    Никак не могу сообразить, почему получается следующий результат

    <!--shcode--><pre><code class='CODE'>#include<iostream>using namespace std;int main(){                double a[M[N = {                         {2.9,5.6,8.9,6.3,1.7,2.0,0.5,1.0,9.3},                  
          {-0.4,4.3,5.0,1.2,1.8,-0.8,2.7,0.6,5.1},                        {-1.0,-0.9,5.8,1.5,2.5,0.8,3.8,9.2,2.0},                        {0.6,3.4,7.4,13.2,7.3,1
    0.1,12.3,10.6,14.0},                        {-1.0,-4.3,-4.7,-3.2,7.7,5.4,1.7,7.6,1.4},                        {-0.7,-3.4,-1.1,-3.4,-4.5,0.8,1.5,3.4,-6.5},                        {-1.4,-2.0,-2.1,-6.3,-2.2,-3.0,1.7,8.8,1.6},                        {-1.2,-3.9,-2.8,-6.4,-0.5,-1.3,-1.1,13.6,3.3}                         };double x = (a[1[0/a[0[0) * a[0[0;cout << a[1[0 - (a[1[0/a[0[0) * a[0[0;            return 0;}[/CODE]


    Должно выводить 0, а выдаёт какой-то невразумительный ответ -5.55112e-017

    Подскажите пожалуйста, что не так?
     
  2. ivashovLEX

    ivashovLEX New Member

    Регистрация:
    5 авг 2014
    Сообщения:
    4
    Симпатии:
    0
    Ну потому что -5.55112e-017 - это очень маленькое число, это и есть ноль (т.н. машинный ноль).
    Но у вас же дробные числа, да еще двойной точности. "0", который вы хотите получить - это целое число.
    Дак вот в компутере возникают погрешности при вычислениях и вот эти погрешности вы и получили себе на экран ( -5.55112e-017)

    Сообщение отредактировал r04 - 1:06:2014, 06:52
     
  3. PetrovichVMF

    PetrovichVMF Member

    Регистрация:
    26 авг 2014
    Сообщения:
    10
    Симпатии:
    0
    спасибо за ответ)

    хм...а можно как-то всё таки 0 получить? Может используя библиотеку какую?

    Вроде элементарная задача - отнять два равных числа друг из друга и получить ноль.

    Такой результат мне надо получить в рамках задачи разработки алгоритма метода исключения Гаусса (решение системы линейн уравненний).
    Т.е нужно будет умножать первую строку матрицы на коэффициент и вычитать полученную строку из других строк.
     
  4. rrrFer

    rrrFer Well-Known Member
    Команда форума C\C++ Team

    Регистрация:
    6 сен 2011
    Сообщения:
    1.324
    Симпатии:
    36
    Зачем? - вам компьютер дал правильный результат.
     
  5. ivashovLEX

    ivashovLEX New Member

    Регистрация:
    5 авг 2014
    Сообщения:
    4
    Симпатии:
    0
    ну можно использовать нечеткое вравнение (такая функция есть в некоторых библиотеках)

    <!--shcode--><pre><code class='CODE'>bool fuzzycompare(const double &a, const double &b) {  return fabs(a - b) < 0.000001;}[/CODE]

    ну как-то так.


    Задача элементарная, но в компутере нет равных дробных чисел.
    Грубо говоря,
    a = 1, b = 1

    1.0000000000000000000001
    и
    1.00000000000000000000001
    или
    0.999999999999999999999999
    Вот такие вот дела.
     
Загрузка...

Поделиться этой страницей