Форум программистов, компьютерный форум CyberForum.ru

floating point error - C++

Восстановить пароль Регистрация
 
korez
8 / 8 / 0
Регистрация: 22.02.2011
Сообщений: 179
04.09.2012, 17:18     floating point error #1
C++
1
2
3
4
5
6
7
8
int i = 124; int j = 0; "c" и "y" это float с диапазоном от 1 до 2; 
x это long double от 0.01 до 100; 
tempsum - long double; cr - long double;
--------------------------------------------------------------------------
for(; i>0; i--, j++)
{   cr = *c - (stp1.mass[j].y);
            correctmul(&cr, &csp, stp1);
    tempsum += (cr * stp1.mass[j].x * 1000);} //<--- overflow
в указанной строке происходит переполнение
мненужно только 5 знаков после запятой в самом крайнем случае.
с этой ошибкой я довольно часто сталкиваюсь так что мне нужно както решить ее основательно. раньше я просто увеличивал точность(double-> long double).
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.09.2012, 17:18     floating point error
Посмотрите здесь:

C++ Floating point error:Domain.Abnormal program termination - ??? это что значит?
C++ Floating point error:Overfull
C++ Floating point overflow
Illegal use of floating point C++
C++ Ошибка: Illegal use of floating point
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
novi4ok
549 / 502 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
04.09.2012, 17:26     floating point error #2
значения переменных при переполнении покажи.
korez
8 / 8 / 0
Регистрация: 22.02.2011
Сообщений: 179
04.09.2012, 21:16  [ТС]     floating point error #3
tempsum = 80.013511776622025;
cr = -0.049996376037597656; - это 0.05 представленная в long double
stp1.mass[j].x = 0.029999999329447746 - это 0.03 представленная в long double
j = 122;
i = 2

Добавлено через 14 минут
tempsum = 78.513620529019278;
немного ошибся на один ход
cr = -0.059998035430908203; - это 0.06 представленная в long double
stp1.mass[j].x = 0.039999999105930328 - это 0.04 представленная в long double
j = 123;
i = 1;

Добавлено через 3 часа 13 минут
я разложил цикл получилось что переполнение вызывает
вот это выражение
stp1.mass[j].x * 1000;
novi4ok
549 / 502 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
04.09.2012, 21:22     floating point error #4
Цитата Сообщение от korez Посмотреть сообщение
получилось что переполнение вызывает
вот это выражение
stp1.mass[j].x * 1000;
и какое значение имеет в этот момент
C++
1
stp1.mass[j].x
?
korez
8 / 8 / 0
Регистрация: 22.02.2011
Сообщений: 179
04.09.2012, 22:49  [ТС]     floating point error #5
stp1.mass[j].x = 0.039999999105930328

Добавлено через 53 секунды
novi4ok, как вообще бороться с переполнением чисел с плавающей точкой?
novi4ok
549 / 502 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
04.09.2012, 22:56     floating point error #6
т.е. ты хочешь сказать, что при умножении трех сотых на тычесю возникает переполнение? что-то ты не там копал.

Добавлено через 6 минут
Цитата Сообщение от korez Посмотреть сообщение
stp1.mass[j].x = 0.039999999105930328

Добавлено через 53 секунды
novi4ok, как вообще бороться с переполнением чисел с плавающей точкой?
отлавливать и принимать меры. какие еще варианты? подозреваю, эта ситуация бросает особый случай. ловить и действовать по обстоятельствам. или погуглить-почитать, как народ борется. не приходилось вплотную сталкиваться. в фортране когда-то
korez
8 / 8 / 0
Регистрация: 22.02.2011
Сообщений: 179
04.09.2012, 23:11  [ТС]     floating point error #7
как отлавливать (перехватывать?).

Добавлено через 10 минут
сейчас еще раз проверил это точно так
stp1.mass[j].x = 0.039999999105930328;
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.09.2012, 10:22     floating point error
Еще ссылки по теме:

C++ Illegal use of floating point
Floating point overflow C++
Много ошибок illegal use of floating point C++

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

Или воспользуйтесь поиском по форуму:
novi4ok
549 / 502 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
05.09.2012, 10:22     floating point error #8
а cr?

с "перехватывать" это был неправильный совет. почитал, народ убежден, что эти ситуации нужно предотвращать, используя правильные алгоритмы.
в ассемблере проще, там можно проверять после каждой операции так наз. флаг переполнения. он все равно проверяется, но в случае чего просто получишь результат 1.#INF или что-то подобное.
Yandex
Объявления
05.09.2012, 10:22     floating point error
Ответ Создать тему
Опции темы

Текущее время: 10:38. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru