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

C++

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 106, средняя оценка - 4.87
YuliLa
4 / 4 / 0
Регистрация: 15.10.2010
Сообщений: 71
#1

Вещественные числа с плавающей точкой, точность вычислений - C++

07.06.2012, 12:31. Просмотров 13132. Ответов 70
Метки нет (Все метки)

Работаю над проектом, требующим большую точность вычисления вещественных чисел.
Решила использовать long double в надежде получить точность побольше.
Столкнулась с тем, что C++ Builder просто отказывается давать желаемую точность.
Точность необходима до 10^20. То есть до 20 числа после запятой.
Подскажите пожалуйста как решить данную проблему.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.06.2012, 12:31     Вещественные числа с плавающей точкой, точность вычислений
Посмотрите здесь:

Усечение числа с плавающей точкой C++
Точность числа с плавающей точкой C++
Как получить дробную часть числа с плавающей точкой? C++
Отличить целое от числа с плавающей точкой в 32-разрядном регистре C++
Перевод из десятичной системы счисления в двоичную числа с плавающей точкой C++
C++ Ifstream считать из файла числа с плавающей точкой
C++ Неправильный вывод числа с плавающей точкой
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
vxg
Модератор
3024 / 1826 / 190
Регистрация: 13.01.2012
Сообщений: 6,928
07.06.2012, 12:50     Вещественные числа с плавающей точкой, точность вычислений #2
видимо придется реализовать свой класс чисел с произвольным количеством знаков после запятой или взять чей-нибудь. а вообще - поработать с предметной областью: упростить, привести, сделать с расчетами что-нибудь снижающее требования к точности. люди вообще раньше атомные бомбы на линейках рассчитывали)
YuliLa
4 / 4 / 0
Регистрация: 15.10.2010
Сообщений: 71
07.06.2012, 14:41  [ТС]     Вещественные числа с плавающей точкой, точность вычислений #3
vxg, видимо придется писать свой класс или все-таки переписывать на Java =)
vxg
Модератор
3024 / 1826 / 190
Регистрация: 13.01.2012
Сообщений: 6,928
07.06.2012, 15:21     Вещественные числа с плавающей точкой, точность вычислений #4
для чего такая точность если это не гос тайна?
YuliLa
4 / 4 / 0
Регистрация: 15.10.2010
Сообщений: 71
07.06.2012, 16:39  [ТС]     Вещественные числа с плавающей точкой, точность вычислений #5
Цитата Сообщение от vxg Посмотреть сообщение
для чего такая точность если это не гос тайна?
Вычисление старшего показателя Ляпунова, с помощью нейросетевого алгоритма.
От так...
Gremlin
513 / 301 / 26
Регистрация: 30.07.2008
Сообщений: 606
07.06.2012, 18:06     Вещественные числа с плавающей точкой, точность вычислений #6
C++
1
2
    float f = 12.01234567890123456789;
    Form1->Caption = FloatToStrF( (f + 0.00000000000000000001), ffNumber, 100, 20);
Avazart
7044 / 5221 / 259
Регистрация: 10.12.2010
Сообщений: 22,947
Записей в блоге: 17
07.06.2012, 18:13     Вещественные числа с плавающей точкой, точность вычислений #7
А при чем тут Java ?
Тут скорее в том проблема что выводите не правильно... приведите пример кода...
YuliLa
4 / 4 / 0
Регистрация: 15.10.2010
Сообщений: 71
07.06.2012, 21:05  [ТС]     Вещественные числа с плавающей точкой, точность вычислений #8
Цитата Сообщение от Avazart Посмотреть сообщение
А при чем тут Java ?
Тут скорее в том проблема что выводите не правильно... приведите пример кода...
Я абсолютно ничего не вывожу, я просто должна найти значение логарифма разности двух чисел, а эти два числа имеют очень маленькую разность, около 1e-20. Сам алгоритм основан на том, что два числа должны иметь очень маленькое расхождение. Поэтому проблема не в считывании и не выводе.
Avazart
7044 / 5221 / 259
Регистрация: 10.12.2010
Сообщений: 22,947
Записей в блоге: 17
07.06.2012, 21:12     Вещественные числа с плавающей точкой, точность вычислений #9
!!!!!
приведите пример кода...
YuliLa
4 / 4 / 0
Регистрация: 15.10.2010
Сообщений: 71
07.06.2012, 21:32  [ТС]     Вещественные числа с плавающей точкой, точность вычислений #10
Цитата Сообщение от Avazart Посмотреть сообщение
!!!!!
Если вы конечно сможете что-то понять =)
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
45
46
47
48
49
50
51
//////////////////////////////////////////////////////
//////О Ц Е Н К А    А Р Б И Т Р А////////////////////
//////////////////////////////////////////////////////
AlgLyap(int otkl,int iter)
/*otkl - отклонение -16*/
{
  double d0;
  long double xh_1, xh_h_1, E;
 
   d0=pow(10, otkl);
   do {
      h=0;
      NS(iter,Nznach);
      for (i=0; i<Nin; i++)
      {
         xh[i]=etalon[i+h];
      }
      for (i=0; i<Nin-1; i++)
      {
         xh_h[i]=xh[i];
      };
      xh_h[Nin-1]=xh[Nin-1]+d0;
      xh_1= Prognoz(Nin,xh,h);
      xh_h_1=Prognoz(Nin, xh_h,h);
      xh[Nin]=xh_1;
      xh_h[Nin]=xh_h_1;
         arbitr[h]=log(fabs(xh_1-xh_h_1));
      iter++;
   } while (arbitr[h] < -200);
   h++;
   iter=0;
   do {
      xh_1=Prognoz(Nin,xh,h+iter); //прогнозирование на 1 значение вперед
      xh_h_1=Prognoz(Nin, xh_h,h+iter);
      xh[Nin+h]=xh_1;
      xh_h[Nin+h]=xh_h_1;
         arbitr[h]=log(fabs(xh_1-xh_h_1));
      if (arbitr[h]< -200)
      {
         h--;
         iter++;
      };
      h++;
      flag=true;
      if ((arbitr[h-1]>0) || (h>=etalon.size()/Nznach - Nznach))
      {
    flag=false;
      };
   } while(flag==true);
   return 0;
}
Avazart
7044 / 5221 / 259
Регистрация: 10.12.2010
Сообщений: 22,947
Записей в блоге: 17
07.06.2012, 21:52     Вещественные числа с плавающей точкой, точность вычислений #11
Уже с самого начала непонятно как ф-ция AlgLyap() возвращает значения?
Evg
Эксперт CАвтор FAQ
17306 / 5554 / 347
Регистрация: 30.03.2009
Сообщений: 15,114
Записей в блоге: 26
07.06.2012, 22:16     Вещественные числа с плавающей точкой, точность вычислений #12
Код
$ gcc -xc /dev/null -dM -E | grep LDBL
...
#define __LDBL_EPSILON__ 1.08420217248550443401e-19L
...
Т.е. на интеловском 80-битном long double значение эпсилон 10^-19, что, насколько я понимаю, недостаточно для текущей постановки задачи
Avazart
7044 / 5221 / 259
Регистрация: 10.12.2010
Сообщений: 22,947
Записей в блоге: 17
07.06.2012, 22:30     Вещественные числа с плавающей точкой, точность вычислений #13
А погрешность возникает уже при 10^-15 как я понимаю
Миниатюры
Вещественные числа с плавающей точкой, точность вычислений  
YuliLa
4 / 4 / 0
Регистрация: 15.10.2010
Сообщений: 71
07.06.2012, 22:42  [ТС]     Вещественные числа с плавающей точкой, точность вычислений #14
Evg, вот именно =(

Avazart, там в формуле где log(fabs(x1-x2)) под логарифмом появляется недопустимый ноль, поэтому проблема в разности чисел, она настолько мала, что x1-x2=0, а в самом деле там должно быть 1*10^-18
Avazart
7044 / 5221 / 259
Регистрация: 10.12.2010
Сообщений: 22,947
Записей в блоге: 17
07.06.2012, 23:00     Вещественные числа с плавающей точкой, точность вычислений #15
Мда самомому интересно стало...
Где то уже проскакивала тема с точностью вычислений... если не подводит память там еще была ссылка на литературу...
Avazart
7044 / 5221 / 259
Регистрация: 10.12.2010
Сообщений: 22,947
Записей в блоге: 17
07.06.2012, 23:21     Вещественные числа с плавающей точкой, точность вычислений #16
Avazart, там в формуле где log(fabs(x1-x2)) под логарифмом появляется недопустимый ноль, поэтому проблема в разности чисел, она настолько мала, что x1-x2=0, а в самом деле там должно быть 1*10^-18
Это ведь совсем другое дело я думал разность логарифмов нужна с большой точностью
Ничего не понимаю...тут вроде все нормально как и должно быть...
Миниатюры
Вещественные числа с плавающей точкой, точность вычислений  
Evg
Эксперт CАвтор FAQ
17306 / 5554 / 347
Регистрация: 30.03.2009
Сообщений: 15,114
Записей в блоге: 26
07.06.2012, 23:23     Вещественные числа с плавающей точкой, точность вычислений #17
Цитата Сообщение от Avazart Посмотреть сообщение
Ничего не понимаю...тут вроде все нормально
Насколько я понимаю, фишка не в конкретном значении, а в разнице между двумя очень маленькими значениями
YuliLa
4 / 4 / 0
Регистрация: 15.10.2010
Сообщений: 71
08.06.2012, 00:22  [ТС]     Вещественные числа с плавающей точкой, точность вычислений #18
Avazart, не забывай о том что я про С++Builder, на Visual все нормально, все работает. А вот в Билдере это все-таки проблема.
и да,Evg, ты прав. Фишка в разнице мало чем отличающихся чисел.
Avazart
7044 / 5221 / 259
Регистрация: 10.12.2010
Сообщений: 22,947
Записей в блоге: 17
08.06.2012, 00:25     Вещественные числа с плавающей точкой, точность вычислений #19
YuliLa,Ну у меня ж работает как видишь
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.06.2012, 09:11     Вещественные числа с плавающей точкой, точность вычислений
Еще ссылки по теме:

Округлить числа с плавающей точкой C++
Конструирование значения целого числа или числа с плавающей точкой по его дампу C++
C++ Вывод числа с плавающей точкой
Выделить подстроку представляющую запись вещественного числа с плавающей точкой C++
Перевод числа с плавающей точкой из шестнадцатиричного в двоичный вид C++

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

Или воспользуйтесь поиском по форуму:
Evg
Эксперт CАвтор FAQ
17306 / 5554 / 347
Регистрация: 30.03.2009
Сообщений: 15,114
Записей в блоге: 26
08.06.2012, 09:11     Вещественные числа с плавающей точкой, точность вычислений #20
Цитата Сообщение от YuliLa Посмотреть сообщение
я про С++Builder, на Visual все нормально
Этого быть не может, т.к. точность вычислений - это фича процессора, а не компилятора.

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

Проще всего это выяснить, посмотрев, что напечатает код:

C
1
printf ("%d\n", sizeof (long double));
Добавлено через 37 секунд
Цитата Сообщение от Avazart Посмотреть сообщение
YuliLa,Ну у меня ж работает как видишь
Что именно у тебя работает?
Yandex
Объявления
08.06.2012, 09:11     Вещественные числа с плавающей точкой, точность вычислений
Ответ Создать тему
Опции темы

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