IPB

Добро пожаловать, гость ( Вход | Регистрация )

> Double в Си, нужна помощь
рффшник
7.2.2008, 14:24
Сообщение #1


Новичок
*

Группа: Пользователи Braingames
Сообщений: 15
Регистрация: 21.4.2007
Пользователь №: 137



Я сам не программист, но для решения некоторых прикладных задач потребовалось изучить Си. И при решении одной из таких задач вылезла одна маленькая проблемка. Есть некоторая проверка истинности :

if ((выражение типа дабл)!=0){
нечто
}

но иногда выходит так, что выражение, которое должно быть равно нулю - равно некоторому очень маленькому числу, что приводит к ненужному выполнению условия (выражение типа дабл)!=0. Из-за этого программа работает не вполне корректно. Можно исправить проблему, если вместо проверки равенства сделать другую проверку:

if (fabs(выражение типа дабл)>x)

но встает вопрос, каким минимальным можно взять "х"? Эмпирически оно получается порядка 10^-14. Но у меня нет гарантий, что определенном стечении обтоятельств не потребуется, скажем, 10^-13.

Как быть, господа программисты?

ЗЫ если это важно: выражения типа дабл равно сумма квадратов n double чисел минус квадрат суммы n double чисел

Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
 
Ответить в эту темуОткрыть новую тему
Ответов
Mouse
7.2.2008, 17:38
Сообщение #2


и.о. админа
**

Группа: Администраторы
Сообщений: 86
Регистрация: 5.12.2006
Пользователь №: 20



QUOTE
Проблема стандартна и во всех языках решается одинаково - выбором этого х.

проблемма в операциях с потерей данных. всё зависит от того с какими числами работаете, и сколько операций происходит(и какие они, не помню как называются но операции +- - плохие */ - хорошие)

проблемма обычно возникает если числа несоразмерные т.е. отношение порядка длинны мантисы.
т.е. 1е300+1е250-1е300=0(в С++)

погрешности(относительная) операций типа +- = 1е-15*(разрядность_большего по_модулю-разрядность_меньшего_по_модулю)^10. т.е 1.???+1000.???? даст погрешность 1е-12

для сравнения положительных чисел типа сумма квадратов лучше использовать не обсолютную погрешность, а относительную.
т.е.
double m1=max(fabs(a),fabs(cool.gif),m2=min(fabs(a),fabs(cool.gif);
if(m2/m1>0.999999)то равны

QUOTE
Хотя есть ведь стандарт ANSI, а в нем вроде все системно независимо.

типы в С++ системо зависиммы
например long double в MS/Intel С++ это 8байт(15знаков мантиса), в Борланде 10(19знаков вроде), что странно т.к. 10байт это вроде родной для х86 тип.
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения

Сообщения в этой теме
рффшник   Double в Си   7.2.2008, 14:24
nik_vic   Проблема стандартна и во всех языках решается один...   7.2.2008, 15:08
рффшник   Проблема стандартна и во всех языках решается оди...   7.2.2008, 16:24
nik_vic   Хотелось бы знать, разве не существует некого кон...   7.2.2008, 17:19
Mouse   проблемма в операциях с потерей данных. всё завис...   7.2.2008, 17:38
Geen   Дисперсия неравна нулю, если есть различающиеся чи...   7.2.2008, 17:58
рффшник   Mouse, спасибо! Geen, о какой дисперсии и о к...   7.2.2008, 19:38
waldian   Mouse, спасибо! Geen, о какой дисперсии и о ...   7.2.2008, 20:20
Geen   Да просто выражение в написанном виде ни что иное...   7.2.2008, 22:20
рффшник   Да просто выражение в написанном виде ни что иное...   7.2.2008, 23:14
Mouse   ввели в ступор. для дисперсии в выражении вроде е...   7.2.2008, 23:26
рффшник   double сравнивать на = нельзя. это основы компьют...   7.2.2008, 23:44
Mouse   не меньшей, а сравнимой. т.е. ошибка будет где-то...   8.2.2008, 0:22
рффшник   сравните состояние милиордеров по версии различн...   8.2.2008, 0:45
рффшник   Господа, еще один вопрос: у меня есть дабл и я хоч...   8.2.2008, 9:21
Geen   %.15g например   8.2.2008, 12:17
рффшник   %.15g например ty!   11.2.2008, 18:25


Ответить в эту темуОткрыть новую тему
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0 -

 



- Упрощённая версия Сейчас: 16.7.2025, 14:37
Яндекс.Метрика