С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.80/35: Рейтинг темы: голосов - 35, средняя оценка - 4.80
4 / 4 / 2
Регистрация: 05.02.2013
Сообщений: 441
1

Теряется точность при вычислении с double

21.08.2015, 08:17. Показов 6507. Ответов 77
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток.
В процессе решения кубического уравнения, у меня теряется точность переменной типа double. Пробовал использовать TTmath.h результата не прибавило (возможно я её криво использовал).

Короче говоря вещественный корень получается равный:
z0 = 880256255399783.00

В matlab тот же самый алгоритм, так же даёт 880256255399783.00

А должен быть:
z0 = 880256255399784.42497741663615572; - Этот корень получился в matlab с помощью функции solve()

Я так понимаю это произошло из-за переполнение мантиссы double ? Которая для double не может превышать 2^53 - 1;
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.08.2015, 08:17
Ответы с готовыми решениями:

При переводе string в long double теряется дробная часть
Помогите с программой. При переводе string в long double дробная часть становится равной нулю(не...

Теряется точность
Видимо в этой проге теряетмя точность. Не проходит только 1 тест. #include <iostream>...

Куда теряется точность?
Для примера, есть формула (a+b)3 - a3. В расчетах с хранением промежуточных результатов и без него...

Теряется точность в сравнении с exel
Точность измерений на С++ меньше чем на exel. Нужно это исправить. Код проги #include <iostream>...

77
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
21.08.2015, 16:09 41
Author24 — интернет-сервис помощи студентам
Как и обещал, выкладываю пример с библиотеками.
Но есть один нюанс: Makefile и библиотеки для MinGW, при чём библиотеки скомпилированы под архитектуру моего ноутбука (-march=corei7).
Вложения
Тип файла: 7z p.7z (416.6 Кб, 4 просмотров)
0
4 / 4 / 2
Регистрация: 05.02.2013
Сообщений: 441
21.08.2015, 16:21  [ТС] 42
Спасибо castaway, буду пробовать.
Действительно были немного не те данные, в матлабе с помощью solve получил:
880077597617982.68914501842987757
это для
a3 = 1
b3 = -8.800775976179623e+014
c3 = -1.794402976530432e+016
d3 = -9.331775087260467e+016
На плюсах около того но не то. Так что вы как раз кстати.

это на плюсах:
880077597617981.50
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
21.08.2015, 16:23 43
Abraziv__, пожалуйста. Можешь предоставить "те" данные? Мне самому интересно попробовать.
Кликните здесь для просмотра всего текста
Abraziv__, можно на "ты". Я не гордый.
0
4 / 4 / 2
Регистрация: 05.02.2013
Сообщений: 441
21.08.2015, 16:28  [ТС] 44
Не хилый у тебя ноутбук )))) i7 нынче под 30 стоит (сам проц)
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
21.08.2015, 16:28 45
Цитата Сообщение от Abraziv__ Посмотреть сообщение
это для
У меня хрен редьки не слаще:
880077597617981.55417906412441071
880077597617982.68914501842987757
0
4 / 4 / 2
Регистрация: 05.02.2013
Сообщений: 441
21.08.2015, 16:33  [ТС] 46
Беда.
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
21.08.2015, 16:34 47

Не по теме:

Цитата Сообщение от Abraziv__ Посмотреть сообщение
Не хилый у тебя ноутбук )))) i7 нынче под 30 стоит (сам проц)
i7 разные бывают) У меня Core i3. Просто компилятор/MSYS2 сам определяет нужную архитектуру при компиляции GMP и MPFR. GCC/MSYS2 определил у меня архитектуру corei7. У него нет понятия архитектуры "corei3".



Добавлено через 1 минуту
Цитата Сообщение от Abraziv__ Посмотреть сообщение
Беда.
У меня с математикой "не важно", думай в чём может быть проблема а я проверю у себя.
0
4 / 4 / 2
Регистрация: 05.02.2013
Сообщений: 441
21.08.2015, 16:53  [ТС] 48
Хорошо, спасибо за ответы. Буду думать. Как найду в чём беда отпишусь сразу же.

Добавлено через 17 минут
Короче я думаю, что ошибка накапливается ещё до решения кубического уравнения. А матлаб может выдавать неправильно, т.к. скорее всего уравнение там решает численным методом. Но возможно я ошибаюсь, т.к. при подстановке "матлабовского значения", решение получается немного ближе к 0. Надо короче переделываться всё программу на плюсах (под GMP) и смотреть.
0
2337 / 1824 / 753
Регистрация: 27.07.2012
Сообщений: 5,396
21.08.2015, 16:59 49
Цитата Сообщение от Abraziv__ Посмотреть сообщение
Надо короче переделываться всё программу на плюсах (под GMP) и смотреть.
Можно из матлаба скомпилировать С++ библиотеку с этими расчётами.
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
21.08.2015, 16:59 50
Не торопись делать выводы.
Я кое-что поправил в своей программе, и у меня получилось следующее:
880077597617982.68914501842987757 --- твой вариант
880077597617982.63914501842987873 --- мой вариант
Abraziv__, ты не ошибся в 42-м сообщении когда писал сотую долю?
0
4 / 4 / 2
Регистрация: 05.02.2013
Сообщений: 441
21.08.2015, 17:28  [ТС] 51
880077597617982.68914501842987757 - скопипастил из матлаба. Выходит что не ошибся
880077597617981.50 -скопипастил из плюсов

Что не так было в твоей реализации?
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
21.08.2015, 17:38 52
Цитата Сообщение от Abraziv__ Посмотреть сообщение
Что не так было в твоей реализации?
Я заменил возведение в степень 1/3 на кубический корень.
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include <iostream>
#include <iomanip>
#include "mpreal.h"
 
int main() {
    mpfr::mpreal::set_default_prec( mpfr::digits2bits( 100 ) );
 
    mpfr::mpreal pi = 3.1415926535897932384626433832795;
    mpfr::mpreal a3 = 1;
    mpfr::mpreal b3 = -8.800775976179623e+014;
    mpfr::mpreal c3 = -1.794402976530432e+016;
    mpfr::mpreal d3 = -9.331775087260467e+016;
 
    mpfr::mpreal p3 = (3 * a3 * c3 - b3 * b3) / (3 * a3 * a3);
    mpfr::mpreal q3 = (2 * b3 * b3 * b3 - 9 * a3 * b3 * c3 + 27 * a3 * a3 * d3) / (27 * a3 * a3 * a3);
 
    mpfr::mpreal q32 = q3 / 2;
    mpfr::mpreal p33 = p3 / 3;
    mpfr::mpreal delta = q32 * q32 + p33 * p33 * p33;
 
    mpfr::mpreal fi, y0;
    if ( delta > 0 ) {
        y0 = mpfr::root( -q3 / 2 + mpfr::sqrt( delta ), 3 ) +
             mpfr::root( -q3 / 2 - mpfr::sqrt( delta ), 3 );
    } else {
        if ( delta < 0 ) {
            if ( q3 < 0 ) {
                fi = mpfr::atan2( -mpfr::sqrt( delta ), -q3 / 2 );
            } else {
                if ( q3 > 0 ) {
                    fi = mpfr::atan2( -mpfr::sqrt( delta ), -q3 / 2 ) + pi;
                } else {
                    fi = pi / 2;
                }
            }
            y0 = 2 * mpfr::sqrt( -p3 / 2 ) * mpfr::cos( fi / 3 );
        } else {
            y0 = mpfr::root( -q3 / 2, 3 ) * 2;
        }
    }
 
    std::cout << std::setprecision( 32 );
    std::cout << y0 - b3 / 3 << std::endl;
}
Цитата Сообщение от Abraziv__ Посмотреть сообщение
скопипастил из матлаба. Выходит что не ошибся
Получается, что ошибка либо в Mathlab, либо в GMP/MPFR/MPFR++.
0
4 / 4 / 2
Регистрация: 05.02.2013
Сообщений: 441
21.08.2015, 17:39  [ТС] 53
John Prick
Толку то, матлаб то тоже не правильно считает.

castaway
Я повторюсь, возможно у тебя правильно.
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
21.08.2015, 17:58 54
Цитата Сообщение от Abraziv__ Посмотреть сообщение
castaway
Я повторюсь, возможно у тебя правильно.
Предлагаю разобраться в чём проблема.
0
4 / 4 / 2
Регистрация: 05.02.2013
Сообщений: 441
21.08.2015, 18:20  [ТС] 55
Поддерживаю, просто сейчас доступа к компу нету. Мне тоже безумно любопытно, как разберусь так сразу же напишу сюда. Так что господа, наберёмся терпения =))) Ну или кому интересно матлабовский код есть, исходные данные - самые поздние,
решение системы:
x должен быть равен 0, z тоже = 0.
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
21.08.2015, 18:34 56
Цитата Сообщение от Abraziv__ Посмотреть сообщение
как разберусь так сразу же напишу сюда.
Буду ждать.
0
4 / 4 / 2
Регистрация: 05.02.2013
Сообщений: 441
21.08.2015, 18:43  [ТС] 57
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
22.08.2015, 13:05 58
Abraziv__, привет. Есть новости?
0
4 / 4 / 2
Регистрация: 05.02.2013
Сообщений: 441
22.08.2015, 14:27  [ТС] 59
castaway
Привет. Вот только сел делать, весь день был занят. Сейчас собираю gmp.

Добавлено через 46 минут
беда с этой mpfr
нету
#include <cstdint>
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
22.08.2015, 14:32 60
Abraziv__, какая среда/компилятор? Как выгладит сообщение об ошибке?
0
22.08.2015, 14:32
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.08.2015, 14:32
Помогаю со студенческими работами здесь

Точность в double
Добрый день Мне задали сделать проект в универе - Калькулятор с великой точностю. Я уже почти...

Точность вычислений у double
Дана задача: &quot;Определить, на сколько нулей заканчивается факториал числа n&quot;. Пример: вводим &quot;25&quot;,...

Точность.Тип double
Вопрос такой. Пишу программу, в которой имеется цикл: double t=0, dt = 0.000001; t = t +...

Точность типа double
Всем привет! У меня такой код,точность как видите страдает,так как мне нужно с точностью до 20...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru