Страницы: 1
RSS
косяк в программе или так было задумано?
 
Уважаемые знатоки, в процессе работы на Exel  неожиданно столкнулся с «косяком», который, как оказалось, сидит в самом Exelе. Ситуация была банальная, но а если бы, не дай Бог, «пришлось везти патроны».    
 
            Формулы               результат  
=ЕСЛИ(16-15=1,"истина","ложь")        ИСТИНА  
=ЕСЛИ(16.1-15.1=1,"истина","ложь") ИСТИНА  
=ЕСЛИ(16.2-15.2=1,"истина","ложь") ИСТИНА  
=ЕСЛИ(16.3-15.3=1,"истина","ложь") ИСТИНА  
=ЕСЛИ(16.4-15.4=1,"истина","ложь") ЛОЖЬ  
=ЕСЛИ(16.5-15.5=1,"истина","ложь") ИСТИНА  
=ЕСЛИ(16.6-15.6=1,"истина","ложь") ИСТИНА  
=ЕСЛИ(16.7-15.7=1,"истина","ложь") ИСТИНА  
=ЕСЛИ(16.8-15.8=1,"истина","ложь") ИСТИНА  
=ЕСЛИ(16.9-15.9=1,"истина","ложь") ЛОЖЬ  
=ЕСЛИ(17-16=1,"истина","ложь")        ИСТИНА
 
Без примера только одно - ищите "точность вычислений в Excel" или "стандарт вычислений в Excel".  
Попробуйте применить округление.
 
Досточтимый Vikttur, попробовал я и так и этак...  
Для серьезной программы слишком уж тупой "косяк" получается.  
Заранее надо сообщать, что с дробными числами в логических операциях    
возможны проблемы.
 
Это не косяк программы. Это недостаток стандарта вычислений. Вы же не будете ругать производителей автомобилей за выбоины на дорогах?
 
Вы считаете, что элементарная логическая цепочка с использованием простейших десятичных дробей для "вездеходного" Exela действительно серьезная проблему!!!  
У меня пустячная логика из-за этой проблемы сбой дает. Или на пальцах посчитать надежнее?
 
Еще раз - это не стандарт вычислений Excel.    
EEE 754 - стандарт двоичной арифметики с плавающей точкой.  
Ошибка возникает на 16 знаке после запятой. Откуда 16 знак? Читайте о стандарте:   
http://www.vbstreets.ru/VB/Articles/66541.aspx
 
Понятно. Тогда не могли бы вы посоветовать, каким образом обойти эти грабли, поскольку ваше предложение с округлением не действует, как и снижение точности до значений "на экране".  
И только ли после "16 с запятой" этот стандарт вылазит наружу?
 
16,4-15,4=0,999999999999998  
ОКРУГЛ(16.4-15.4,1)
 
Досточтимый Vikttor, неужели вы не заметили, что я вас спрашивал о логических построениях, а не об арифметических действиях...    
Посмотрел ссылку, спасибо, все стало ясно, вспомнил по Суперкалк, когда-то была такая замечательная программа без косяков.  
Думаю, для всех посетителей орума надо внимательно с ней познакомиться. Особенно с разделом "заключение".  
Цитирую:Стандарт IEEE 754 широко применяется в технике и программировании. При этом хочется отметить, что в нем заложены существенные недостатки. Создается впечатление, что в разработке стандарта не принимали участие профессиональные математики. Директор института математики и ее применений в Миннеаполисе, США Дуглас Н.Арнольд утверждает, что целый ряд крупнейших аварий с человеческими жертвами и миллиардными убытками всецело обязан нынешней технологии компьютерных вычислений и представлений данных по стандарту IEEE 754.    
Вы можете прочитать об этом в статье IEEE754-тика угрожает человечеству      
Как программист скажу, никогда не применяйте одинарную точность (single) в программах, если полностью не представляете и не контролируете всю процедуру расчета, так как результат компьютерного расчета может быть не предсказуем.  
 
Вот результат вычислений этой программы:  
a=0.3 c=0.3 c : a = 1.00000003973643  
a=0.3 c=0.3 a : c = 0.999999960263572  
Здесь вы видите не только не точный результат, но и зависимость результата от расположения переменных. Это только одна операция, представьте, что операций тысячи. Результат таких вычислений будет не предсказуем.    
 
Вот ещё пример: Text1.Text = (c / a - 1) * 10000000000  
Если посчитать на бумажке ответ будет = 0, а если на компьютере = 397,364299242753  
Как Вы считаете- есть ли разница между 0 и 397 (допустим в ядерных бомбах!)
 
{quote}{login=Fred}{date=02.11.2012 02:21}{thema=}{post}...для всех посетителей орума надо внимательно с ней познакомиться...{/post}{/quote}Fred, этот вопрос обсуждался уже столько раз, что постоянных посетителей форума (и не только этого) наверное уже тошнит от него :-)  
 
ЗЫ Для точных вычислений (например при производстве ядерных бомб) используются специализированные программы, а Excel - это часть офисного пакета и складывать суммы от продаж пирожков вполне годится :-)  
Просто используйте инструменты по назначению, ведь всё-равно не получится забить гвоздь в лист металла n мм сложенной в трубочку газетой ;-)
 
{quote}{login=Fred}{date=02.11.2012 02:21}{thema=}{post}...я вас спрашивал о логических построениях, а не об арифметических действиях...{/post}{/quote}  
И я Вам о том же.  
1=1 Логично?  
16,4-15,4=1 Логично? Да, если на бумажке, и нет, если в компьютере - стандарт не позволяет:  
16,4-15,4=0,999999999999998<>1  
ОКРУГЛ(16.4-15.4,1)=1 - вот теперь и с математикой, и с логикой все в порядке.
 
Досточтимый Serge 007, я конечно понимаю, что от пересчета «пирожков», ничего кроме «тошноты», в сухом остатке не остатmся не может. А вот пример, со свернутой в трубочку газетой, весьма обнадеживает… осталось только воплотить.
 
> Создается впечатление, что в разработке стандарта не принимали участие профессиональные математики.  
 
Есть другое мнение на этот счет: http://habrahabr.ru/post/112953/  
<<  
Инициатива создать единый стандарт для представления чисел с плавающей запятой подозрительно совпала с попытками в 1976 году компанией Intel разработать «лучшую» арифметику для новых сопроцессоров к 8086 и i432. За разработку взялись ученые киты в этой области, проф. Джон Палмер и Уильям Кэхэн. Последний в своем интервью высказал мнение, что серьезность, с которой Intel разрабатывала свою арифметику, заставила другие компании объединиться и начать процесс стандартизации. >>  
Видимо, "Директор института математики и ее применений в Миннеаполисе, США Дуглас Н.Арнольд" чувствует обиду от того, что он не принял участия в разработке стандатра :))
Страницы: 1
Читают тему
Наверх