Форум программистов CodeGuru
18 Октябрь 2017, 07:42:00 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.

Войти
Новости:
 
   Начало   Помощь Войти Регистрация  
Страниц: [1]   Вниз
  Печать  
Автор Тема: Арифметические операции с элементами массива  (Прочитано 3472 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Gudvin ill be back
Новичок
*
Офлайн Офлайн

Сообщений: 5


Просмотр профиля
« : 31 Май 2014, 15:41:32 »

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

Код:

#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

Подскажите пожалуйста, что не так?
Записан
3V
Администратор
Ветеран
*****
Офлайн Офлайн

Сообщений: 1347



Просмотр профиля WWW
« Ответ #1 : 06 Июнь 2014, 18:08:18 »

А M, N почему не объявлены ?
Записан

Gudvin ill be back
Новичок
*
Офлайн Офлайн

Сообщений: 5


Просмотр профиля
« Ответ #2 : 06 Июнь 2014, 18:24:45 »

объявлены, просто я их сюда не опубликовал ).

Уже подсказали решение на другом форуме.
Записан
3V
Администратор
Ветеран
*****
Офлайн Офлайн

Сообщений: 1347



Просмотр профиля WWW
« Ответ #3 : 06 Июнь 2014, 19:02:57 »

объявлены, просто я их сюда не опубликовал ).

Просто в глаза бросилось. Такое собираться то не должно было.

Уже подсказали решение на другом форуме.

Хм, ясно...
На самом деле такая штука получается из-за потери точности в мантиссе double при делении (см. как устроен double) и последующем умножении.
Так что в принципе это нормально.

Если нужны какие-то точные вычисления, то можно либо вручную оптимизировать код, избегая там где не нужно таких вот штук (пытаться по возможности использовать целые числа, и т.д.), либо использовать библиотеки для точных вычислений (например, которые хранят числа в виде обыкновенных дробей).
Записан

Страниц: [1]   Вверх
  Печать  
 
Перейти в:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.21 | SMF © 2015, Simple Machines Valid XHTML 1.0! Valid CSS!