Итак простая задачка для Excel:
Встаем прямо на самую первую ячейку A1 и начинаем вводить числа в столбик(вводим число и Enter и так далее):
0,1
1
0,57
-0,68
0
-0,79
Готово!
Теперь формула в ячейку A7: =A1-СУММ(A2:A6)
Ответ ожидается равным нулю.
Сделайте форматы ячеек "Числовой", число десятичных знаков 20 и Вы увидите волшебное число: 0,00000000000000024980
Вы вот тут можете грешным делом захотеть упростить задачу и просто просуммировать все и получить ожидаемые 0.2
формула "=СУММ(A1:A6)" дает ответ: 0,20000000000000000000
И никакого фокуса не выйдет!
Так что секретная формула именно =A1 - СУММ(A2:A6)
(Хотя допускаю что есть и другие)
А Вы думаете предпоследнее число там зря?
Вставьте в ячейку A5 вместо нуля единицу и получите ответ: -1,00000000000000000000
Какие будут мнения?
P.S. Только что столкнулся и слегка ошарашен удивлен.
Пока не разбирался да и поздновато сегодня.
P.S.S.
Ячейки можно выбирать любые, я тут писал именно эти чтоб было понятно где что.
И эти числа не единственная комбинация.
Первоначальные числа в расчете которых я столкнулся с данным эффектом были совершенно большие, я их специально уменьшил.
Но эффект как видите остался.
Здравствуйте, Cicero, Вы писали:
C>Итак простая задачка для Excel: C>Встаем прямо на самую первую ячейку A1 и начинаем вводить числа в столбик(вводим число и Enter и так далее): C>0,1 C>1 C>0,57 C>-0,68 C>0 C>-0,79 C>Готово! C>Теперь формула в ячейку A7: =A1-СУММ(A2:A6) C>Ответ ожидается равным нулю. C>Сделайте форматы ячеек "Числовой", число десятичных знаков 20 и Вы увидите волшебное число: 0,00000000000000024980
Здравствуйте, T4r4sB, Вы писали:
TB>Не знаю, получается 0.2 и 1.2. Шо в уме, шо в екселе, шо в самодельном калькуляторе.
Давайте считать вместе:
сначала посчитаем сумму "СУММ(A2:A6) = 1+0,57-0,68-0,79
1) 1+0,57=1,57
2) 1,57-0,68=0,89
3) 0,89-0,79=0,1
т.о. СУММ(A2:A6)=0,1
теперь вычитаем это из A1.
A1 у нас тоже 0,1.
т.е. последнее действие:
4) 0,1-0,1 = 0
Здравствуйте, Cicero, Вы писали:
C>Здравствуйте, T4r4sB, Вы писали:
TB>>Не знаю, получается 0.2 и 1.2. Шо в уме, шо в екселе, шо в самодельном калькуляторе.
C>Давайте считать вместе: C>сначала посчитаем сумму "СУММ(A2:A6) = 1+0,57-0,68-0,79 C>1) 1+0,57=1,57 C>2) 1,57-0,68=0,89 C>3) 0,89-0,79=0,1 C>т.о. СУММ(A2:A6)=0,1 C>теперь вычитаем это из A1. C>A1 у нас тоже 0,1. C>т.е. последнее действие: C>4) 0,1-0,1 = 0
C>Где ошибка?
Почему из 0.1 вычитаем 0.1, если знак везде +?
Если есть желание — найдется 1000 возможностей.
Если нет желания — найдется 1000 причин.
Ну это это к в C++ float или double. Смотри вещественные числа, Мантисса и Капулетты.
Если поля в Экселе указать как Number с 2 знаками после запятой, то он все красиво показывает.
Если формулу укзаать A1-A2-A3-A4-A5-A6-A7 то он ноль рисует. Видать SUM вносит погрешность.
Если есть желание — найдется 1000 возможностей.
Если нет желания — найдется 1000 причин.
Здравствуйте, Cicero, Вы писали: C>Давайте считать вместе:
А, я прочитал невнимательно. Я просто сумму взял :D
Мог бы не напускать туману, сразу предложить вбить в калькулятор
0.1-(1+0.57-0.68-0.79)
мой самодельный выдаёт 0.33881317890172013e-00019, например
Здравствуйте, CreatorCray, Вы писали:
TB>>мой самодельный выдаёт 0.33881317890172013e-00019, например
CC>Мой самодельный выдаёт 0 CC>Может ты свой неправильно готовишь?
Младшие биты мантиссы при конверсии из текстовых в плавучку это серьёзнейшая головная боль, даже массовые библиотечные реализации strtod() с компанией тут лажают. Зависание при конверсии пограничного значения (Java, PHP).
Или тут "Python now uses David Gay’s algorithm for finding the shortest floating point representation that doesn’t change its value", причём в обе стороны (результат точный, но сама конверсия значительно дороже, и её посчитали оправданной только недавно).
Здравствуйте, netch80, Вы писали:
CC>>Мой самодельный выдаёт 0 CC>>Может ты свой неправильно готовишь?
N>Младшие биты мантиссы при конверсии из текстовых в плавучку
Я забыл тег irony, my bad.
Мой калькулятор внутри все числа представляет в виде дроби. Там нет незапланированных ошибок округления.
Здравствуйте, CreatorCray, Вы писали:
CC>>>Мой самодельный выдаёт 0 CC>>>Может ты свой неправильно готовишь? N>>Младшие биты мантиссы при конверсии из текстовых в плавучку CC>Я забыл тег irony, my bad.
Ну, будут ссылки для публики.
CC>Мой калькулятор внутри все числа представляет в виде дроби. Там нет незапланированных ошибок округления.
Это хорошо до момента вычисления sqrt(3). (Считаем, что я пометил <irony>.)
Здравствуйте, netch80, Вы писали:
CC>>Мой калькулятор внутри все числа представляет в виде дроби. Там нет незапланированных ошибок округления. N>Это хорошо до момента вычисления sqrt(3). (Считаем, что я пометил <irony>.)
А его всё равно точно вычислить нельзя по определению.
Просто говорим до какой точности хотим.
Здравствуйте, T4r4sB, Вы писали:
CC>>Может ты свой неправильно готовишь? TB>У меня обычный 10-байтовый плавучий, символьную арифметику я не мутил, конечно же. TB>Потому и результат такой, конечно.
Сорри, мне там надо было смайлик дописать, чота как то забыл.