On-line: гостей 1. Всего: 1 [подробнее..]
АвторСообщение





Пост N: 166
Зарегистрирован: 12.11.06
ссылка на сообщение  Отправлено: 07.11.10 10:24. Заголовок: Волшебные числа и операции


Доброе утро!

Вот наткнулся на очередную ошибку xHarbour и Clipper. Думал, что глюк ОС или ПК, но нет. Пример ошибки - оператор "остаток от деления":

8.8 * 3 = 26.4 или 3.3 * 3 = 9.9, но операции (%) дают
26.4%8.8 = 8.8 или (НО правильно) 9.9%3.3 = 0

Вопрос - как Вы обходите данные глюки? Или где в "арифметике" ожидать очередных "засад"? До кучи напомню об ошибочной работе функции Int в Clipper (в xHarbour кажется работает правильно)

Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 149 , стр: 1 2 3 4 5 6 7 8 All [только новые]







Пост N: 236
Зарегистрирован: 12.11.06
ссылка на сообщение  Отправлено: 26.05.12 09:23. Заголовок: Доброе утро. Напишу..


Доброе утро.

Напишу много букф, т.к. исправление данного бага считаю важным и это проявляется в программе на Harbour, а на клиппере всё, правильно, как и должно быть .... Наверное не был услышан, но умею пользоваться шаблонами и etc. Более того понимаю Диму - попытался сделать самостоятельный пример и там всё работает правильно. Пример (иммитация логики программы):


proc ptest()
loca a:=" ", b:=" "
cls
@ 1,1 say "введите символы" get a
@ 2,1 say "нажмите символ " get b
read

ptest2()
retu

proc ptest2()
loca a:=" ", b:=" "
@ 4,1 say "введите символы" get a
@ 5,1 say "нажмите символ " get b
read
@ 6,0 say "нажмите клавишу "+b+" "+a
inkey(0)
retu

Далее приведу реальный текст процедур, где ***** будут выделены ключевые моменты. Это один из десятков отчетов, где наблюдается данный глюк. Разбил на два сообщения, т.к. форум не хочет по русски воспринимать копипаст


Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 238
Зарегистрирован: 12.11.06
ссылка на сообщение  Отправлено: 26.05.12 09:32. Заголовок: „P„‚„Ђ„t„Ђ„|„w„..


„P„‚„Ђ„t„Ђ„|„w„u„~„y„u. „Q„u„p„|„Ћ„~„Ђ„u „Ѓ„‚„y„|„Ђ„w„u„~„y„u...
Всё конечно жутко понятно? ... попробую разделить на маленькое кусочки
Скрытый текст


Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 239
Зарегистрирован: 12.11.06
ссылка на сообщение  Отправлено: 26.05.12 09:53. Заголовок: „P„‚„t„Ђ„|„w„u„..


Скрытый текст


Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 242
Зарегистрирован: 12.11.06
ссылка на сообщение  Отправлено: 07.06.12 13:56. Заголовок: Добрый день! Систем..


Добрый день!

Системные программисты (разработчики), понимающие принципы "математики" xHarbour... ГДЕ ВЫ!!! Очередная пачка глюков данной системы разработки:

1. Деление и умножение обсудили раннее, а оказывается xharbour не умеет даже вычитать и складывать

Сколько по Вашему будет (12.2 - 4.4 - 7.8) = ?, а теперь проверьте:
WAIT Str((12.2 - 4.4 - 7.8)*1000000000,19,6)

2. Синтаксическая ошибка Wait "MAMA" * "PAPA" успешно пропускается компилятором, но программа вываливается по windows ошибке "too many recursive error handler calls"

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 2396
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 07.06.12 14:25. Заголовок: AndreyZh пишет: Ско..


AndreyZh пишет:

 цитата:
Сколько по Вашему будет (12.2 - 4.4 - 7.8) = ?,


Округляй результат.
Clipper кстати так же отработал.

? (12.2 - 4.4 - 7.8)==0 // .F.
? round((12.2 - 4.4 - 7.8),2)==0 // .T.

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 228
Зарегистрирован: 11.10.11
ссылка на сообщение  Отправлено: 07.06.12 15:42. Заголовок: AndreyZh пишет: Ско..


AndreyZh пишет:

 цитата:
Сколько по Вашему будет (12.2 - 4.4 - 7.8) = ?, а теперь проверьте:



Проверил! MS VC++ 2010:

if ( 12.2 - 4.4 - 7.8 == 0 ) std::cout << "equal to zero\n"; 
else std::cout << "not equal to zero\n";

std::cout << 12.2 - 4.4 - 7.8 << std::endl;


Результат:


 цитата:
not equal to zero
-8.88178e-016



Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 124
Зарегистрирован: 10.07.07
ссылка на сообщение  Отправлено: 07.06.12 16:15. Заголовок: AndreyZh пишет: Ско..


AndreyZh пишет:

 цитата:
Сколько по Вашему будет (12.2 - 4.4 - 7.8) = ?


Это явление в вычислительной математике давно описано в учебниках по методам вычислений. Например, Бахвалов Н.С. Численные методы, М. 1975. В параграфе 4 "О вычислительной погрешности", в частности, автор пишет: "Здесь нам впервые встретилось явление потери значащих цифр (или "пропадания значащих цифр"), имеющее место при вычитании близких величин ...".

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 243
Зарегистрирован: 12.11.06
ссылка на сообщение  Отправлено: 07.06.12 16:42. Заголовок: Dima пишет: Округля..


Dima пишет:

 цитата:
Округляй результат.
Clipper кстати так же отработал.

? (12.2 - 4.4 - 7.8)==0 // .F.
? round((12.2 - 4.4 - 7.8),2)==0 // .T.



На это считаю полезным отметить... заодно посмотрите результат Сыроежки... получаемая цифирь может быть, как больше, так и меньше нуля, кроме это вполне допустимы расчеты, где нормально, что результат "около нуля", т.е. банальные проверки типа "если имеется долг (сумма отгрузки - сумма платежей) клиента, то запретить ему отгрузку", а особенно если имеются скидки/наценки по накладной превращаются в громадные аналитические конструкции, где пытаешься отрабатывать, как "нормальные" погрешности округления, так и погрешности, связанные с логикой подгонки цифр в документах, так и с погрешностями "типа правильного счета" системы разработки.

Просто замечу, что ни в клиппер, ни в фоксе, ни в си шарп, ни в аксес таких заморочек (на всей этой команде приходится пописывать) и "особенностей" не возникает, т.е. это не "математические особенности округления", а недоработки инструмента... в данном случае xharbour.

Что по особенности Клиппер:
а := 0.00
if a == 0.... Над этой ошибкой пришлось в древности много работать и учитывать, кроме того она по разному обрабатывается на разных ОС и разных типах процессоров.

Вообще в данной темке "не обсираю" харб, а просто предупреждаю о возможных грабельках других раработчиков и если не интересно, то ...

Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 2366
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 07.06.12 18:19. Заголовок: AndreyZh пишет: 1. ..


AndreyZh пишет:

 цитата:
1. Деление и умножение обсудили раннее, а оказывается xharbour не умеет даже вычитать и складывать



Так мы ведь в прошлом году как раз вычитание и обсуждали, не ?
Вот цитата от 22.09.11 18:58:


 цитата:
Если "объяснения" по делению можно было как-то понять, то ошибки выитания

(10000.00 - (21832.60 - 11832.60)) * 10000000000 = 0.018189894
(10000.00 - (21932.65 - 11932.65)) * 10000000000 = -0.018189894
(1.00 - (3.00 - 2.00) * 10000000000 = 0.0000



Я и тест делал, в котором видно, что примерно в 1/8 случаев при вычитании double fpu не дает ноль, или равенство.
Для гарантированного получения нужного результата необходимо промежуточное округление. И харбор тут ни при чем, как и клиппер и любой другой язык, использующий явно или неявно тип double.

Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 2367
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 07.06.12 18:25. Заголовок: AndreyZh пишет: Про..


AndreyZh пишет:

 цитата:
Просто замечу, что ни в клиппер, ни в фоксе, ни в си шарп, ни в аксес таких заморочек (на всей этой команде приходится пописывать) и "особенностей" не возникает, т.е. это не "математические особенности округления", а недоработки инструмента... в данном случае xharbour.



Как же не возникает, когда именно возникает именно такая же заморочка с клиппером. Дима же проверил. Да и я только что проверил.
Насчет фокса мы когда-то выясняли, там имеется недокументированное неявное округление.
О прочих инструментах говорить не буду.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 768
Зарегистрирован: 27.01.07
ссылка на сообщение  Отправлено: 07.06.12 18:48. Заголовок: Надо уже в Интел и А..


Надо уже в Интел и АМД телегу писАть. Чё-та их ФПУ хреново складыватьумножатьвычитатьделить умеют... :)

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 2397
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 07.06.12 18:52. Заголовок: По поводу фокса можн..


По поводу фокса можно почитать тут

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 244
Зарегистрирован: 12.11.06
ссылка на сообщение  Отправлено: 08.06.12 08:48. Заголовок: Dima пишет: По пово..


Dima пишет:

 цитата:
По поводу фокса можно почитать тут



Доброе утро господа!

Я не фоксист, не сишник, не и etc... Просто приходится зачастую использовать разный инструмент для решения конкретных задач. Все задачи связаны с бизнес расчетами и как следствие математика является основным нюансом на который обращают внимание пользователи. Как уже отмечал... не пытаюсь очень вникнуть во внутреннию топологию систем разработки. Все проблемки выявляют пользователи (по скромной оценке около 1000 человек) и ставят меня в известность... после чего пытаюсь найти источник проблемы и способ её исправления.

Если пофилософствоать, то инструмент работы с базами или финансовой информацией должен в первую очередь обеспечивать стабильность работы с ней и "бухгалтерскую" точность (точность бухгалтерских расчетов). Если же в программе нужно также рассчитать траекторию полета спутника, то придется дописывать програмку на Си.

Теперь по конкретным инструментам. Пока ещё в основном используется Clipper 5.01R + CTII и на его "методику" ориентируюсь в "сравнениях". На "вход" переделки под xharbour пошла программа отлаженная в течении 17 лет, в том числе отработаны "грабельки" данной версии клиппера, а тут оказывается не только есть "частичная" несовместимость языков, но и иные алгоритмы "математики".

Лирика... на sql фоксисты рассуждают "куда податься с него" и получается, харбоур "тоже не вариант"? Хотя и имеет море предпосылок, что бы заменить все виды померших настольных СУБД.

Что по "неумению считать" здесь озвучена идея "недокументированное неявное округление", наверное, что имело быть в пятом клиппере... а ведь это весьма разумно в бизнес приложениях.


Под обсуждение арифметики как-то спрятались и другие "занятные" проблемки, озвученные выше:

1. Синтаксическая ошибка Wait "MAMA" * "PAPA" успешно пропускается компилятором, но программа вываливается по windows ошибке "too many recursive error handler calls"

2. Нелюбовь xHarbour к точке и запятой, в качестве переменной формы ввода.

Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 2369
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 08.06.12 09:37. Заголовок: AndreyZh пишет: 1. ..


AndreyZh пишет:

 цитата:
1. Синтаксическая ошибка Wait "MAMA" * "PAPA" успешно пропускается компилятором, но программа вываливается по windows ошибке "too many recursive error handler calls"



Что-то я не могу подтвердить такой результат.
Компилятор и должен пропускать такую конструкцию, поскольку харбор язык с нестрогой типизацией. Это не синтаксическая ошибка, и клиппер это выражение тоже компилирует, как и харбор.
А при его выполнении возникает ошибка "argument error", поскольку операция умножения для строк недопустима.
"too many recursive error handler calls" - это уже результат работы обработчика ошибок.
Стандартный обработчик ошибок xHarbour такое сообщение не дает. Возможно, у Вас он заменен своим. Смотрите свой обработчик ошибок.


Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 769
Зарегистрирован: 27.01.07
ссылка на сообщение  Отправлено: 08.06.12 09:45. Заголовок: AndreyZh пишет: то ..


AndreyZh пишет:

 цитата:
то инструмент работы с базами или финансовой информацией должен в первую очередь обеспечивать стабильность работы с ней и "бухгалтерскую" точность (точность бухгалтерских расчетов).


Откуда инструмент может знать, что программисту нужна "бухгалтерская" точность? Инструмент её обеспечивает, но только тогда, когда человек явно этого попросит.

Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 2370
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 08.06.12 09:46. Заголовок: AndreyZh пишет: Что..


AndreyZh пишет:

 цитата:
Что по "неумению считать" здесь озвучена идея "недокументированное неявное округление", наверное, что имело быть в пятом клиппере... а ведь это весьма разумно в бизнес приложениях.



Ничего не понятно. Клиппер 5.01, который Вы используете, при операциях с double ведет себя точно так же, как и харбор. Никакого недокументированного округления там и в помине нет.
Так зачем его вводить в харборе ? Тогда харбор будет вести себя не так, как клиппер.
В ваших примерах клиппер и харбор дают одинаковый результат. Можете дать пример, в котором они ведут себя по разному ?

С клиппером у вас дожны были быть такие же заморочки, как и с харбором. Но с клиппером почему-то это проблемы не создавало, а с харбором начало создавать ? Или просто на клиппер некому было пожаловаться ? :)


Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 245
Зарегистрирован: 12.11.06
ссылка на сообщение  Отправлено: 08.06.12 11:21. Заголовок: Pasha пишет: Andrey..


Pasha пишет:

 цитата:
AndreyZh пишет:

цитата:
1. Синтаксическая ошибка Wait "MAMA" * "PAPA" успешно пропускается компилятором, но программа вываливается по windows ошибке "too many recursive error handler calls"

Что-то я не могу подтвердить такой результат.
Компилятор и должен пропускать такую конструкцию, поскольку харбор язык с нестрогой типизацией. Это не синтаксическая ошибка, и клиппер это выражение тоже компилирует, как и харбор.
А при его выполнении возникает ошибка "argument error", поскольку операция умножения для строк недопустима.
"too many recursive error handler calls" - это уже результат работы обработчика ошибок.
Стандартный обработчик ошибок xHarbour такое сообщение не дает. Возможно, у Вас он заменен своим. Смотрите свой обработчик ошибок.


Использую редакцию xHarbour 1.2.1 rev 6633... по обработчикам ошибок не пугайте такими словами (шутка). Ругается не харб, а судя по win окнам сами винды... Смотрите:


Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 770
Зарегистрирован: 27.01.07
ссылка на сообщение  Отправлено: 08.06.12 11:25. Заголовок: AndreyZh пишет: Руг..


AndreyZh пишет:

 цитата:
Ругается не харб, а судя по win окнам сами винды...


Нет, это не винда, а именно хХ. Обработчик ошибок зациклился на вызовах самого себя.

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 246
Зарегистрирован: 12.11.06
ссылка на сообщение  Отправлено: 08.06.12 11:33. Заголовок: PSP пишет: Откуда и..


PSP пишет:

 цитата:
Откуда инструмент может знать, что программисту нужна "бухгалтерская" точность? Инструмент её обеспечивает, но только тогда, когда человек явно этого попросит.



А что... какой результат можно попросить от операции 12.2 - 4.4 - 7.8?

Теперь... от куда данные цифры. Есть операция распределения товаров накладной по нескольким складам (отделам магазина). В данном случае пришло 12.2 кг. товара, где в первый отдел нужно определить 4.4 кг, а во второй 7.8. Бедный оператор соглашается с числом 7.8, а прога в ответ не могу.... блок программы уже с извращениями (исправлениями):
 
nMax := qtyAll

fSwopen(21,0,3,79,cOther,2)
DO WHIL !Eof() .AND. codInv==cInv

// Читаем распределение по конкретному складу и товару.
cCodStores := Spac(2)
nQty := nMax

@ 1,1 SAY WARES->name+" Осталось распред."+Str(nMax,10,3)
@2,1 SAY "Распределить на склад:" GET cCodStores VALI Eval(bCodStores,cCodStores) .AND. Eval({||DevPos(2,28),DevOut(HB_STORE->shotName,cOther),TRUE})
@2,56 SAY "Количество:" GET nQty PICT "9999999.999" VALI lValid({||nQty>=0.AND.nQty<=nMax+0.000001},"Неверное кол-во. Отрицательно или слишком большое!") .AND. zlWar(DETALREC->codWares,nQty)
READ
IF LastKey()==K_ESC
lBreak := TRUE; EXIT
ENDI

/* Запоминаем данные в массиве и меняем настройки. Склад может
повторится, в этом случае добавляем количество в туже строку */

lArr := TRUE
FOR nI := 1 TO Len(aArr)
IF aArr[nI,1]==DETALREC->codWares.AND.aArr[nI,2]==cCodStores
lArr := FALSE; EXIT
ENDI
NEXT nI

IF lArr // Новый товар и склад.
Aadd(aArr,{DETALREC->codWares,cCodStores,nQty,DETALREC->sales,DETALREC->tax_n,DETALREC->tax_s})
ELSE // Имеется строка в массиве.
aArr[nI,3] += nQty
ENDI
nMax -= nQty


// Еще не весь товар текущего наименования распределили.
IF nMax > 0 THEN LOOP

DbSkip()
nMax := qtyAll
ENDD


А заодно отвечаю на:

Pasha пишет:

 цитата:
С клиппером у вас дожны были быть такие же заморочки, как и с харбором. Но с клиппером почему-то это проблемы не создавало, а с харбором начало создавать ? Или просто на клиппер некому было пожаловаться ? :)



Этот блок использовался без изменения уже больше 20 лет... еще и системы не было... а операция "распределения" производится (провожу ежегодный анализ) более 50 000 раз по всем клиентам (или перебирают больше 200 000 комплектов цифр ежегодно)... была бы проблема - давно бы наткнулся. На xHarb она поперла в виде звонков ежедневно, как начал переводить розничные магазины.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 771
Зарегистрирован: 27.01.07
ссылка на сообщение  Отправлено: 08.06.12 12:25. Заголовок: AndreyZh пишет: А ч..


AndreyZh пишет:

 цитата:
А что... какой результат можно попросить от операции 12.2 - 4.4 - 7.8?


_SET_DECIMALS в какое значение установлен? Может поменьше сделать, а? Ты уж определись, какая точность тебе нужна.
Не думаю, что при расчете масс, сумм, количеств нужна точность в 10 знаков.

Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 149 , стр: 1 2 3 4 5 6 7 8 All [только новые]
Ответ:
1 2 3 4 5 6 7 8 9
большой шрифт малый шрифт надстрочный подстрочный заголовок большой заголовок видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки моноширинный шрифт моноширинный шрифт горизонтальная линия отступ точка LI бегущая строка оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 240
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет