Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Арифметические Операции С Элементами Массива 
:(
    Опции темы
prolonizi
Дата 15.9.2014, 20:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 22.8.2014

Репутация: нет
Всего: нет



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

Код
#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

Подскажите пожалуйста, что не так?
PM MAIL   Вверх
sQu1rr
Дата 15.9.2014, 21:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 597
Регистрация: 11.11.2008
Где: london

Репутация: 3
Всего: 13



Давайте вы попробуете написать то же самое, только по человечески.  smile 
PM MAIL Skype GTalk   Вверх
Dukaloholpiti
Дата 16.9.2014, 04:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 28.12.2013
Где: Москва

Репутация: нет
Всего: нет



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

Сообщение отредактировал r04 - 1:06:2014, 06:52
PM MAIL ICQ Skype   Вверх
sQu1rr
Дата 16.9.2014, 10:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 597
Регистрация: 11.11.2008
Где: london

Репутация: 3
Всего: 13



Если разумеетя англицкий, вот хорошее объяснение почему так происходит
https://www.youtube.com/watch?v=PZRI1IfStY0...u5WGm29I7JiwpnA
PM MAIL Skype GTalk   Вверх
prolonizi
Дата 16.9.2014, 10:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 22.8.2014

Репутация: нет
Всего: нет



спасибо за ответ)

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

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

Такой результат мне надо получить в рамках задачи разработки алгоритма метода исключения Гаусса (решение системы линейн уравненний).
Т.е нужно будет умножать первую строку матрицы на коэффициент и вычитать полученную строку из других строк.
PM MAIL   Вверх
baldina
Дата 16.9.2014, 14:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 32
Всего: 101



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

Код

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

PM MAIL   Вверх
borisbn
Дата 16.9.2014, 20:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 22
Всего: 135



Цитата(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;




--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1421 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.