![]() |
Добро пожаловать, гость ( Вход | Регистрация )
![]() |
рффшник |
![]()
Сообщение
#1
|
Новичок ![]() Группа: Пользователи Braingames Сообщений: 15 Регистрация: 21.4.2007 Пользователь №: 137 ![]() |
Я сам не программист, но для решения некоторых прикладных задач потребовалось изучить Си. И при решении одной из таких задач вылезла одна маленькая проблемка. Есть некоторая проверка истинности :
if ((выражение типа дабл)!=0){ нечто } но иногда выходит так, что выражение, которое должно быть равно нулю - равно некоторому очень маленькому числу, что приводит к ненужному выполнению условия (выражение типа дабл)!=0. Из-за этого программа работает не вполне корректно. Можно исправить проблему, если вместо проверки равенства сделать другую проверку: if (fabs(выражение типа дабл)>x) но встает вопрос, каким минимальным можно взять "х"? Эмпирически оно получается порядка 10^-14. Но у меня нет гарантий, что определенном стечении обтоятельств не потребуется, скажем, 10^-13. Как быть, господа программисты? ЗЫ если это важно: выражения типа дабл равно сумма квадратов n double чисел минус квадрат суммы n double чисел |
![]() ![]() |
Mouse |
![]()
Сообщение
#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( ![]() ![]() if(m2/m1>0.999999)то равны QUOTE Хотя есть ведь стандарт ANSI, а в нем вроде все системно независимо. типы в С++ системо зависиммы например long double в MS/Intel С++ это 8байт(15знаков мантиса), в Борланде 10(19знаков вроде), что странно т.к. 10байт это вроде родной для х86 тип. |
![]() ![]() |
![]() |
Упрощённая версия | Сейчас: 16.7.2025, 14:37 |