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

C++

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

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

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

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

Printf лжет при выводе чисел с плавающей точкой? - C++
void doubleToString(double v, char * str){ if(v < 0) { *str = '-'; v = -v; } int number = static_cast<int>(v); double...

Число с плавающей точкой - C++ Builder
Здравствуйте. Такая проблема: Написал однослойный персептрон. Создаю, обучаю, проверяю - все норм. но при повторном обучении вылезает...

Работа с плавающей точкой в Мемо - C++ Builder
Помогите разобраться: у меня есть число с плавающей точкой. Есть задание чтобы в Мемо отображалось 18 символов из которых заданное число с...

Сравнение чисел с плавающей точкой - C++ Builder
Добрый день. Сегодня заметил странную проблему в C++ Builder (в 6-м и XE). Связана она с сравнением чисел с плавающей точкой. Есть...

сумму чисел с плавающей точкой - C++ Builder
у меня проблема возникла когда я считаю сумму чисел то челые числа считает нормально а с плавающей точкой как то не так например когда я...

Вычисление чисел с плавающей точкой - C++ Builder
делаю калькулятор и столкнулся с проблемой вычисления чисел с плавающей точкой...как можно реализовать подскажите

70
Avazart
Нарушитель
Эксперт С++
7232 / 5404 / 293
Регистрация: 10.12.2010
Сообщений: 23,952
Записей в блоге: 17
07.06.2012, 23:21 #16
Avazart, там в формуле где log(fabs(x1-x2)) под логарифмом появляется недопустимый ноль, поэтому проблема в разности чисел, она настолько мала, что x1-x2=0, а в самом деле там должно быть 1*10^-18
Это ведь совсем другое дело я думал разность логарифмов нужна с большой точностью
Ничего не понимаю...тут вроде все нормально как и должно быть...
0
Миниатюры
Вещественные числа с плавающей точкой, точность вычислений  
Evg
Эксперт CАвтор FAQ
18030 / 6262 / 427
Регистрация: 30.03.2009
Сообщений: 17,209
Записей в блоге: 27
07.06.2012, 23:23 #17
Цитата Сообщение от Avazart Посмотреть сообщение
Ничего не понимаю...тут вроде все нормально
Насколько я понимаю, фишка не в конкретном значении, а в разнице между двумя очень маленькими значениями
0
YuliLa
4 / 4 / 0
Регистрация: 15.10.2010
Сообщений: 71
08.06.2012, 00:22  [ТС] #18
Avazart, не забывай о том что я про С++Builder, на Visual все нормально, все работает. А вот в Билдере это все-таки проблема.
и да,Evg, ты прав. Фишка в разнице мало чем отличающихся чисел.
0
Avazart
Нарушитель
Эксперт С++
7232 / 5404 / 293
Регистрация: 10.12.2010
Сообщений: 23,952
Записей в блоге: 17
08.06.2012, 00:25 #19
YuliLa,Ну у меня ж работает как видишь
0
Evg
Эксперт CАвтор FAQ
18030 / 6262 / 427
Регистрация: 30.03.2009
Сообщений: 17,209
Записей в блоге: 27
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
Avazart
Нарушитель
Эксперт С++
7232 / 5404 / 293
Регистрация: 10.12.2010
Сообщений: 23,952
Записей в блоге: 17
08.06.2012, 13:12 #21
Что именно у тебя работает?
Ну число 10^-25 не воспринимается как 0 и ошибки нет.
0
Evg
Эксперт CАвтор FAQ
18030 / 6262 / 427
Регистрация: 30.03.2009
Сообщений: 17,209
Записей в блоге: 27
08.06.2012, 16:01 #22
Цитата Сообщение от Avazart Посмотреть сообщение
Ну число 10^-25 не воспринимается как 0 и ошибки нет.
А ты распечатай число 1.000...001 (т.е. 1 + 10^-25), сразу увидишь проблему

Именно этот параметр и есть машинное эпислон
0
Avazart
Нарушитель
Эксперт С++
7232 / 5404 / 293
Регистрация: 10.12.2010
Сообщений: 23,952
Записей в блоге: 17
08.06.2012, 17:29 #23
А ты распечатай число 1.000...001 (т.е. 1 + 10^-25), сразу увидишь проблему
Пример кода можно?
0
Evg
Эксперт CАвтор FAQ
18030 / 6262 / 427
Регистрация: 30.03.2009
Сообщений: 17,209
Записей в блоге: 27
08.06.2012, 17:39 #24
C
1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
 
int main (void)
{
  long double ld1 = 1L + 1e-19L;
  long double ld2 = 1L + 1e-20L;
 
  printf ("ld1=%.25Lf\n", ld1);
  printf ("ld2=%.25Lf\n", ld2);
  return 0;
}
Код
$ gcc t.c
$ ./a.out
ld1=1.0000000000000000001084202  <--- отличается от 1.0
ld2=1.0000000000000000000000000  <--- совпадает с 1.0
0
Avazart
Нарушитель
Эксперт С++
7232 / 5404 / 293
Регистрация: 10.12.2010
Сообщений: 23,952
Записей в блоге: 17
08.06.2012, 17:55 #25
Ага понял...

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int _tmain(int argc, _TCHAR* argv[])
{
system("chcp 1251");
 
  long double ld1 = 1L + 1e-19L;
  long double ld2 = 1L + 1e-20L;
 
  printf ("ld1=%.25Lf\n", ld1);
  printf ("ld2=%.25Lf\n", ld2);
 
  printf ("ld2=%.25Lf\n",ld2-1.);
 
system("pause");
return 0;
}
Код
Текущая кодовая страница: 1251
ld1=1.0000000000000000001000000
ld2=1.0000000000000000000000000
dif=0.0000000000000000000000000
Для продолжения нажмите любую клавишу . . .
Добавлено через 7 минут
Но тогда проблема в вычислении самих чисел а не логарифма их разности.
Т.е как они вычилсяются?
0
Avazart
Нарушитель
Эксперт С++
7232 / 5404 / 293
Регистрация: 10.12.2010
Сообщений: 23,952
Записей в блоге: 17
08.06.2012, 18:01 #26
Чет запутался как тогда на VS работает если там уже первое число не отличается?
0
Миниатюры
Вещественные числа с плавающей точкой, точность вычислений  
Evg
Эксперт CАвтор FAQ
18030 / 6262 / 427
Регистрация: 30.03.2009
Сообщений: 17,209
Записей в блоге: 27
08.06.2012, 18:23 #27
Цитата Сообщение от Avazart Посмотреть сообщение
Но тогда проблема в вычислении самих чисел а не логарифма их разности
Ну это целый паровоз проблем, которые зацепляются одна за другую. Сначала делается разность двух чисел, которые очень мало отличаются и эта разность становится либо равной нулю, либо вычисляется с очень большой погрешностью

Цитата Сообщение от Avazart Посмотреть сообщение
Чет запутался как тогда на VS работает если там уже первое число не отличается?
Чему равен sizeof (long double)? Ну и попробуй поиграть порядком. Не -19, а -15 и т.п.
0
Avazart
Нарушитель
Эксперт С++
7232 / 5404 / 293
Регистрация: 10.12.2010
Сообщений: 23,952
Записей в блоге: 17
08.06.2012, 19:08 #28
Чему равен sizeof (long double)?
На Builder2009 - 10, на VS2010- 8...

Добавлено через 3 минуты
Сначала делается разность двух чисел
Да нет проблема у еще раньше когда числам присваиваются числа врезудьтате чего они "обрезаются"...

Поэтому вопрос в том как вычисляются эти числа и можно ли это обойти как нибудь.
0
Evg
Эксперт CАвтор FAQ
18030 / 6262 / 427
Регистрация: 30.03.2009
Сообщений: 17,209
Записей в блоге: 27
08.06.2012, 19:15 #29
Цитата Сообщение от Avazart Посмотреть сообщение
На Builder2009 - 10, на VS2010- 8...
На builder'е правильный long double, на VS2010 - неправильный. Либо это в настройках как-то можно подправить, либо в express edition (если у тебя именно оно) микрософтовцы намерено так сделали. Т.е. сейчас у тебя VS работает как старые компиляторы, т.е. long double эквивалентен double

Цитата Сообщение от Avazart Посмотреть сообщение
Поэтому вопрос в том как вычисляются эти числа и можно ли это обойти как нибудь
Вычисляются согласно стандарту. Для float и double это IEEE-754, для 80-битного long double га intel'е - IEEE-854. В любом случае так работает аппаратура и с этим уже ничего не поделать. Кроме использования специальных библиотек, которые эмулируют ещё бОльшую точность
0
Avazart
Нарушитель
Эксперт С++
7232 / 5404 / 293
Регистрация: 10.12.2010
Сообщений: 23,952
Записей в блоге: 17
08.06.2012, 20:01 #30
Кроме использования специальных библиотек, которые эмулируют ещё бОльшую точность
Я имел ввиду обойти каким нибудь математичеким путем, например разложением в ряд.

Добавлено через 3 минуты
либо в express edition (если у тебя именно оно) микрософтовцы намерено так сделали.
VS2010 Professional

Добавлено через 38 минут
C++
1
2
xh_1= Prognoz(Nin,xh,h);
xh_h_1=Prognoz(Nin, xh_h,h);
Т.е может как-то ф-цию Prognoz() можно переписать....
0
08.06.2012, 20:01
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.06.2012, 20:01
Привет! Вот еще темы с ответами:

Настройка вывода чисел с плавающей точкой - C++ Builder
Испльзую функцию fprintf() для вывода в текстовый файл. Как сделать чтобы эта функция для разделения целой и дробной части использовала...

Ошибка в Borlan C++ Builder c "не допустимым значением с плавающей точкой" - C++ Builder
Приветствую всех! Меня попросили написать не большую программу в Borland C++ Builder, я почти закончил, но у меня возникла одна проблема....

Ввод числа с плавающей запятой - C++ Builder
Как сделать что бы первый символ мог быть или &quot;-&quot; или число, потом чтобы запятая начиналась со второго символа, и могла использоваться лишь...

Точность числа с плавающей точкой - C++
У типа float числа одинарной точности с плавающей запятой обеспечивают относительную точность 7-8 десятичных цифр. Внимание, вопрос!...


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

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

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