On-line: Andrey, гостей 0. Всего: 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: 7396
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 15.06.21 13:49. Заголовок: Pasha пишет: Достат..


Pasha пишет:

 цитата:
Достаточно конечную цифру, я так и делаю


А если складывать вот так ?
 
X+= Base->KLV * Base->CENA , где KLV , "N" ,10,3 а CENA , "N" ,10,2


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




Пост N: 4028
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 15.06.21 14:13. Заголовок: здесь конечно требуе..


здесь конечно требуется промежуточное округление, иначе погрешность в случае дробного количества будет достигать до полкопейки

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





Пост N: 330
Зарегистрирован: 05.11.05
ссылка на сообщение  Отправлено: 15.06.21 19:13. Заголовок: Я сейчас уже не помн..


Я сейчас уже не помню, что у меня было, но были примеры где промежуточное округление и итоговое разные значения давали. Очевидно, что ошибка была не в 0,00....001, а большая и они накапливались.

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




Пост N: 4029
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 15.06.21 20:20. Заголовок: round(1/3+1/3+1/3, 2..


round(1/3+1/3+1/3, 2) --> 1.00

round(1/3, 2)+round(1/3, 2)+round(1/3, 2) --> 0.99

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





Пост N: 331
Зарегистрирован: 05.11.05
ссылка на сообщение  Отправлено: 16.06.21 07:24. Заголовок: Все округления могут..


Все округления могут быть полезны, лучше все и делать.

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




Пост N: 4030
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 16.06.21 09:15. Заголовок: Я обычно обхожусь бе..


Я обычно обхожусь без округления

Сделал такую функцию, для сравнения чисел с точностью до двух десятичных знаков:

 
#include "hbapi.h"
#include "math.h"

HB_FUNC( EQU )
{
double d1 = hb_parnd( 1 );
if( HB_ISNUM( 2 ) )
{
double d2 = hb_parnd( 2 );
hb_retl( fabs( d1 - d2 ) < 0.005 );
}
else
hb_retl( fabs( d1 ) < 0.005 );
}


вместо

nSum1 == nSum2

или подобное

использую

Equ(nSum1, nSum2)

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




Пост N: 4031
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 16.06.21 11:13. Заголовок: Если скинуть в Excel..


Если скинуть в Excel достаточно большой заполненный dbf-файл, порядка 10 тыс.записей, с числовым полем размерностью N,12, 2
и затем с произвольной строки помечать числовую колонку, то начиная примерно с пометки 1500-2000 строк обязательно возникает
погрешность суммы (которую видно внизу Excel) в 8-м знаке в ту или другую сторону, та же микрокопейка

Если продолжать помечать колонку дальше, то при пометке 3-4 тыс строк погрешность может аннигилироваться. Забавно

Эффект лучше наблюдать в LibreOffice. Погрешность суммирования то появляется, то исчезает

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





Пост N: 332
Зарегистрирован: 05.11.05
ссылка на сообщение  Отправлено: 16.06.21 12:20. Заголовок: Pasha пишет: исполь..


Pasha пишет:

 цитата:
использую

Equ(nSum1, nSum2)



А я вставил округление до копейки в функцию и где считал нужным писал valround(значение).

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




Пост N: 3765
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 16.06.21 12:44. Заголовок: rvu пишет где считал..


rvu пишет
 цитата:
где считал нужным писал valround(значение)


Помогает исп. рабочих полей в dbf "N", 19, <все нужные варианты>, т.е через них расчеты.
Т.к. клиент сам ставит варианты nDec для разных групп номенклатуры (2, 3, 4, 5, 7), то привязывал
имя раб. поля к номенклатуре (picture тоже если надо), работает вариант со времен S87

Спасибо: 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 час. Хитов сегодня: 252
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет