Страницы: 1 2 След.
RSS
Ошибка вычисления внутри ЕСЛИ()
 
Мяв!
Имеем 10000 одинаковых формул.
8000 выдают честный 0, а в одном месте - козу. В чем причина?
 
RAN, ДОБРЫЙ ДЕНЬ, мяукать не буду, по губе сделал брм-брм-брм ... :D
заметил лишь, что
Цитата
RAN написал:
козу
только если формат не числовой - если же числовой то все как положено 0...
Может по умолчанию общий формат сам по себе какие-то странные манипуляции/вычисления делает с числами? имхо
Изменено: Mershik - 29.11.2019 11:37:59
Не бойтесь совершенства. Вам его не достичь.
 
но формат "общий" установлен во всем столбце, а коза в 1 строке
 
RAN, в файле у меня на числовом нормально, а на общем нет...
Не бойтесь совершенства. Вам его не достичь.
 
RAN, после выбора ячейки D1 на редактирование, ошибка пропадает
Как вариант округлить до 14 знака (или какая точность Вам нужна)
Изменено: Polkilo - 29.11.2019 11:54:34
 
RAN,  Андрюшенька, без округления сравнивать  - лотерея. Вот "джекпот" и выпал.
По вопросам из тем форума, личку не читаю.
 
Ежели бы =C1=D1 не выдавало ИСТИНА, тогда все понятно. Но тут?
Причем =ЕСЛИ(ЕПУСТО(D1);"ОШИБКА";C1-D1)=(C1-D1) дает ИСТИНА,
а =E1=E2 дает ЛОЖЬ

PS Это даже не коза, а козопотамище!

PPS
Сейчас обнаружил, что в файле две строки со значениями 5,945.
Так вот, одна считается правильно, вторая - нет.
Изменено: RAN - 29.11.2019 12:14:12
 
ну так просто сравнить или вычесть - разные вещи, вот ошибка и набежала, при этом в 16 разряде, что за пределами отведенных для наших глаз 15ти :-)
По вопросам из тем форума, личку не читаю.
 
Цитата
Mershik написал:
у меня на числовом нормально, а на общем нет
Ну так это же всего лишь форматы. Результат то в ячейке по-прежнему не равен нулю, хоть в числовом формате, хоть в общем.  
 
Ошибка возникает в коде при выполнении арифметической операции
11,245 + (-5,3)
При этом оба числа в окне Immediate отображаются одинаково, но не равны...  :cry:
 
Андруй, об этом же говорено-переговорено писано-переписано, нужно следить за темами о формулах, а не только о макросах :)
При математических операциях может появляться ошибка в 16-м знаке после запятой. Ошибка стандарта вычислений.
 
Вить, про стандарт краем уха слышал.
Но, обычно, при этом A<>B. И ежели-бы это было так, вопроса бы не возникло.
 
Здравствуйте, коллеги! См., например, в этой теме.
Владимир
 
А что там такого?
Там A <> B, и, соответственно, A - B <> 0. Все,  как и должно быть.
 
В ячейках "C1" и "D1" есть разные значения.
Это выглядит так как будто файл пришёл из преобразования от какого-то другого "Excela".
 
в А1 написано 00:00
в В1 написано 00:01 (1 минута)
в А2 пишем формулу =A1+$B$1, видим 00:01
в В2 проверим =A2-A1=$B$1, видим ИСТИННА
отметим ячейки А2 и В2 и потянем за уголок вниз
в 3-й строке видим 2 мин и ИСТИНА
в 4-й 3 минуты и ИСТИНА
в 5-й -ОПА!!! ввидим 5 минут, но 5 минут- 4 минуты УЖЕ не равно 1 минуте
потяните еще на 20 строк вниз
не пытайтесь обьяснить результат с точки зрения математики, потому что это обьясняется только стандартом хранения десятичных чисел в компьютере
все в праве игнорировать этот факт, но рано или поздно столкунтся с неожиданностью его существования
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Более ещё ... теперь измените формат "1 минуты" ("B1") на общий, войдите в режим редактирования "F2" и нажмите "Enter" ... и всё стало "истинной правдой".
Значит, "форматирование вредно для здоровья" пользователя Excel ...  :)  
 
Цитата
RAN написал:
Там A <> B, и, соответственно, A - B <> 0.
Нет таких понятий для дробных чисел в приближенном мире. Только так:

Код
ABS(A-B)>1E-6

Правая часть по вкусу (в зависимости от того, о каких числах идет речь).
Владимир
 
A Excel говорит, что есть. A=B=True. И я его за язык не тянул.
Но далее ведет себя странно.
Вне ЕСЛИ() A-B = 0, а внутри - индейская хижина.

Собственно, округлить совсем не проблема, но как определить, где грабли?
 
грабли в нежелании учитывать особенности точности вычислений с десятичными числами
стандарт говорит "возможны эксцессы", неосознанное или сознательное игнорирование стандарта - это и есть уверенный шаг навстречу граблям

ну, и у нас очередная тема, когда предмет дискуссии не имеет никакого отношения к заявленной теме
ибо проблема не в вычислениях внутри ЕСЛИ, а проблема в не знании (не желании) учитывать описанную стандартом ситуацию  
Изменено: Ігор Гончаренко - 30.11.2019 18:56:56
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
:D
Игорь, как часто ты вместо
A-B
применяешь
ОКРУГЛ(A-B;10) ?
Изменено: RAN - 30.11.2019 18:51:11
 
Функция округления (ОКРУГЛ) до определенного количества знаков после запятой лишь уменьшает погрешность округления дробного числа (со знаменателем, отличным от степени двойки) до минимально возможного значения. Дробные числа всегда надо сравнивать, как указано в #18 (и эта конструкция не является длинной).
Изменено: sokol92 - 30.11.2019 19:05:33
Владимир
 
да писать длинные конструкции лениво, а недоумевать почему так произошло, зная что так может произойти - это как называется?
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Заклевали! Отмахиваться не успеваю..
Вы мне лучше объясните, почему
A-B=0
а
ЕСЛИ(ЕПУСТО(B);"ОШИБКА";A-B)<>0
Значения те же, операция тоже, а итог разный.
Вычисления в файле присутствуют.
 
Поклюем еще (ник обязывает) :) .
Число из Вашего файла 5,945 представимо в двоичной системе счисления в виде бесконечной периодической дроби и, соответственно, изначально не может быть точно представлено в формате double. В приближенных вычислениях равенство - это малая по модулю разность.
Изменено: sokol92 - 30.11.2019 19:36:17
Владимир
 
Цитата
sokol92 написал:
в #18 (и эта конструкция не является длинной) ABS(A-B)>1E-6
это конструкция не только не длинная, но еще и не правильная
если у меня есть 2 маленькие (но соизмеримые по величине) значения, например вероятность чего-то там
А = 1/1000000000 (одна миллиардная)
и
В = 99/1000000000 (99 миилиардных)
с точки зрения этого ABS(A-B)>1E-6 разница между ними меньше чем 1Е-6 (т.е. равны)
а на самом деле вероятность этих событий существенно отличается событие В в 99 раз! вероятнее события А
нужно сначала оценить размерность величин, а потом уже выбрать точность, с которой их сравнивать
но подход в сравнении  чисел с определенной точностью, остается универсальным и правильным подходом))
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Я так давным-давно в институте с аглицкого переводил. Берешь словарь, переводишь все слова, но как составить из 10 вполне осмысленных слов 1 не то, чтобы совсем осмысленное, а хоть чуть-чуть... предложение?
Почему в одном случае
Может/не может, хочет/не хочет.
а а другом
Не может/может, Не хочет/хочет.
Где эта грань? Чем определяется?
Изменено: RAN - 30.11.2019 19:55:49
 
Цитата
Ігор Гончаренко написал:
не только не длинная, но еще и не правильная
Игорь, прочитайте про "правую часть" в #18. Для сумм в валюте с 2 знаками после (десятичной) запятой 1E-6 вполне приемлемо (кроме периодов гиперинфляции),
Точность сравнения определяется спецификой задачи и пониманием того, что формат double надежно обеспечивает 15 десятичных  разрядов.
Изменено: sokol92 - 30.11.2019 20:10:42
Владимир
 
Код
Dim x As Currency

Цитата
sokol92 написал:
Для чисел с 2 знаками после (десятичной) запятой 1E-6 вполне приемлемо
Даже несколько избыточно
 
Currency - хорошо, но Excel такой тип значений ячеек не знает, только VBA.
Владимир
Страницы: 1 2 След.
Наверх