Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Арифметические Операции С Элементами Массива


Автор: prolonizi 15.9.2014, 20:41
Добрый день!
Никак не могу сообразить, почему получается следующий результат

Код
#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,10.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;}



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

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

Автор: sQu1rr 15.9.2014, 21:19
Давайте вы попробуете написать то же самое, только по человечески.  smile 

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

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

Автор: sQu1rr 16.9.2014, 10:12
Если разумеетя англицкий, вот хорошее объяснение почему так происходит
https://www.youtube.com/watch?v=PZRI1IfStY0&list=UU9-y-6csu5WGm29I7JiwpnA

Автор: prolonizi 16.9.2014, 10:41
спасибо за ответ)

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

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

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

Автор: baldina 16.9.2014, 14:19
Цитата(prolonizi @  16.9.2014,  10:41 Найти цитируемый пост)
а можно как-то всё таки 0 получить

Код

const double epsilon=1e-15;
if (fabs (value) < epsilon)
  value = 0;

Автор: borisbn 16.9.2014, 20:22
Цитата(baldina @ 16.9.2014,  14:19)
Цитата(prolonizi @  16.9.2014,  10:41 Найти цитируемый пост)
а можно как-то всё таки 0 получить

Код

const double epsilon=1e-15;
if (fabs (value) < epsilon)
  value = 0;

А лучше так
Код
#include <limits>

if (fabs (value) < std::numeric_limits< double >::epsilon() )
  value = 0;


А если уж совсем по-извращенски, то
Код

if (fabs (value) < std::numeric_limits< decltype( value ) >::epsilon() )
  value = 0;


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)