![]() |
Добро пожаловать, гость ( Вход | Регистрация )
![]() |
рффшник |
![]()
Сообщение
#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 Да просто выражение в написанном виде ни что иное как дисперсия набора из этих самых n чисел, а она равна 0 только если все числа равны. ввели в ступор. для дисперсии в выражении вроде ещё одного N нехватает иначе 1^2+1^2!=(1+1)^2 если дело в проверки дисперсия=0(все числа одинаковые) то правильно условие будет(max-min<"погрешность_приборов/компа") double сравнивать на = нельзя. это основы компьютерных вычислений(забыл как у нас этот раздел был). правила там достаточно просты. 0. = считаеться как попадание в область(т.е. |x-y|<погрешность), и чаше всего относительную(типа различие в 6м знаке, т.е что-то типа |x-y|/(|x|+|y|)<1e-6) 1. */ на погрешность почти не влияют 2. + на ответ мало влияет, 1000000001 и 1000000000 можно сказать равно 3. - можно ожидать что угодно, как я привёл пример 10^250 4. ну и так далее, нам этот курс несколько недель читали ![]() |
![]() ![]() |
![]() |
Упрощённая версия | Сейчас: 18.7.2025, 17:27 |