4 / 4 / 0
Регистрация: 15.10.2010
Сообщений: 71
1

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

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

Работаю над проектом, требующим большую точность вычисления вещественных чисел.
Решила использовать long double в надежде получить точность побольше.
Столкнулась с тем, что C++ Builder просто отказывается давать желаемую точность.
Точность необходима до 10^20. То есть до 20 числа после запятой.
Подскажите пожалуйста как решить данную проблему.
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.06.2012, 12:31
Ответы с готовыми решениями:

Точность числа с плавающей точкой
У типа float числа одинарной точности с плавающей запятой обеспечивают относительную точность 7-8...

Максимальная точность для чисел с плавающей точкой
Суть поставленной задачи: дан вектор от 10_000 до 100_000 элементов, нужно проходить по вектору,...

Представить вещественные числа в четырёхбайтовой ячейке памяти в формате с плавающей точкой
Пожалуйста помогите Представить вещественные числа в четырёхбайтовой ячейке памяти в формате с...

В текстовом файле записаны вещественные числа с плавающей точкой. Преобразовать файл, заменив каждое число, округленным
Задача: В текстовом файле записаны вещественные числа с плавающей точкой. Преобразовать файл,...

70
Модератор
3352 / 2127 / 349
Регистрация: 13.01.2012
Сообщений: 8,290
07.06.2012, 12:50 2
видимо придется реализовать свой класс чисел с произвольным количеством знаков после запятой или взять чей-нибудь. а вообще - поработать с предметной областью: упростить, привести, сделать с расчетами что-нибудь снижающее требования к точности. люди вообще раньше атомные бомбы на линейках рассчитывали)
1
4 / 4 / 0
Регистрация: 15.10.2010
Сообщений: 71
07.06.2012, 14:41  [ТС] 3
vxg, видимо придется писать свой класс или все-таки переписывать на Java =)
0
Модератор
3352 / 2127 / 349
Регистрация: 13.01.2012
Сообщений: 8,290
07.06.2012, 15:21 4
для чего такая точность если это не гос тайна?
0
4 / 4 / 0
Регистрация: 15.10.2010
Сообщений: 71
07.06.2012, 16:39  [ТС] 5
Цитата Сообщение от vxg Посмотреть сообщение
для чего такая точность если это не гос тайна?
Вычисление старшего показателя Ляпунова, с помощью нейросетевого алгоритма.
От так...
0
517 / 305 / 58
Регистрация: 30.07.2008
Сообщений: 607
07.06.2012, 18:06 6
C++
1
2
    float f = 12.01234567890123456789;
    Form1->Caption = FloatToStrF( (f + 0.00000000000000000001), ffNumber, 100, 20);
1
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
07.06.2012, 18:13 7
А при чем тут Java ?
Тут скорее в том проблема что выводите не правильно... приведите пример кода...
0
4 / 4 / 0
Регистрация: 15.10.2010
Сообщений: 71
07.06.2012, 21:05  [ТС] 8
Цитата Сообщение от Avazart Посмотреть сообщение
А при чем тут Java ?
Тут скорее в том проблема что выводите не правильно... приведите пример кода...
Я абсолютно ничего не вывожу, я просто должна найти значение логарифма разности двух чисел, а эти два числа имеют очень маленькую разность, около 1e-20. Сам алгоритм основан на том, что два числа должны иметь очень маленькое расхождение. Поэтому проблема не в считывании и не выводе.
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
07.06.2012, 21:12 9
!!!!!
приведите пример кода...
0
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;
}
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
07.06.2012, 21:52 11
Уже с самого начала непонятно как ф-ция AlgLyap() возвращает значения?
0
Evg
Эксперт CАвтор FAQ
21264 / 8280 / 637
Регистрация: 30.03.2009
Сообщений: 22,635
Записей в блоге: 30
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, что, насколько я понимаю, недостаточно для текущей постановки задачи
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
07.06.2012, 22:30 13
А погрешность возникает уже при 10^-15 как я понимаю
Миниатюры
Вещественные числа с плавающей точкой, точность вычислений  
0
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
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
07.06.2012, 23:00 15
Мда самомому интересно стало...
Где то уже проскакивала тема с точностью вычислений... если не подводит память там еще была ссылка на литературу...
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
07.06.2012, 23:21 16
Avazart, там в формуле где log(fabs(x1-x2)) под логарифмом появляется недопустимый ноль, поэтому проблема в разности чисел, она настолько мала, что x1-x2=0, а в самом деле там должно быть 1*10^-18
Это ведь совсем другое дело я думал разность логарифмов нужна с большой точностью
Ничего не понимаю...тут вроде все нормально как и должно быть...
Миниатюры
Вещественные числа с плавающей точкой, точность вычислений  
0
Evg
Эксперт CАвтор FAQ
21264 / 8280 / 637
Регистрация: 30.03.2009
Сообщений: 22,635
Записей в блоге: 30
07.06.2012, 23:23 17
Цитата Сообщение от Avazart Посмотреть сообщение
Ничего не понимаю...тут вроде все нормально
Насколько я понимаю, фишка не в конкретном значении, а в разнице между двумя очень маленькими значениями
0
4 / 4 / 0
Регистрация: 15.10.2010
Сообщений: 71
08.06.2012, 00:22  [ТС] 18
Avazart, не забывай о том что я про С++Builder, на Visual все нормально, все работает. А вот в Билдере это все-таки проблема.
и да,Evg, ты прав. Фишка в разнице мало чем отличающихся чисел.
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
08.06.2012, 00:25 19
YuliLa,Ну у меня ж работает как видишь
0
Evg
Эксперт CАвтор FAQ
21264 / 8280 / 637
Регистрация: 30.03.2009
Сообщений: 22,635
Записей в блоге: 30
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,Ну у меня ж работает как видишь
Что именно у тебя работает?
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.06.2012, 09:11
Помогаю со студенческими работами здесь

Преобразование чисел с плавающей точкой в числа с фиксированной точкой
Здравствуйте, подскажите пожалуйста как заменить вещественные числа с плавающей точкой, числами...

Точность вычислений в double (Обрезание числа)
Здравствуйте! Дело в том, что мне необходимо выводить большие числа с большим количеством знаков...

Числа с плавающей точкой
Здравствуйте, создаю я, значит, батник. И тут столкнулся с такое проблемой: при присвоении...

Числа с плавающей точкой
Как отделить целую часть и дробную? Например имеем число 12.54 число 12 должно бить записано в...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru