Форум: "Начинающим";
Текущий архив: 2011.04.24;
Скачать: [xml.tar.bz2];
ВнизПринтер "портит" выполнение программы? Найти похожие ветки
← →
han_malign (2010-12-23 12:35) [40]
> Не всё так просто
- с currency - просто(ε=0.0001)
>> А деление проверяется на зеро заранее.
> ты не погорячился?
- подразумевался пост 12 © (23.12.10 10:20) [30], и тут надо исходить из вероятности возникновения ситуации...
Если это исключительная, крайне редкая ситуация - то лишнее ветвление(не убирающее необходимости защищенной секции) - избыточно.
Но учитывая:
> {Здесь некотовый код, определены значения переменных rlBase, rlMulti, rlBaseDM, rlMultiDM. Кстати, значение rlBaseDM, rlMultiDM порой бывают равны нулю}
- ситуация вполне нормальная, и ветвление обосновано, т.к. нормальные входные данные не должны порождать исключение(которое дает значительное пенальти производительности)...
← →
Abcdef123 (2010-12-24 05:54) [41]To [40]: Красиво написано, но не поняла, вы за использование использование проверки на нуль или за использование except?
← →
Ega23 © (2010-12-24 06:20) [42]
> вы за использование использование проверки на нуль или
> за использование except?
Дурная постановка вопроса.
← →
Abcdef123 (2011-01-18 08:50) [43]Здравствуйте, Мастера.
Докладываю - наконец-то у клиента всё протестировали, но, ничего не помогло. Проблема существует.
А вот, что произошло на моем компе! Как я писала, что у меня на компе программа работает нормально.
Но, как только я протестировала идею [19], у меня вылетает такая же ошибка! Хотя предложение использовать asm FINIT end; должно бы наоборот - помочь!
Я прошла пошагово, и нашла, что когда
в функции идет деление на ноль, то программа не идет на except, а присваивает результату вот такое больше разрядное значение.
Если я добавлю перед применением формулы проверку на ноль, то ошибки нет.
В общем, чтобы уж точно было понятно привожу описываемые варинты: работаютщие:
function CalcProportionAsAmount(rlTotal, rlSubTotal, rlAmount : Currency) : Currency;
begin
try
result:= rlAmount * (rlSubTotal / rlTotal);
except
result:= 0;
end;
end
function CalcProportionAsAmount(rlTotal, rlSubTotal, rlAmount : Currency) : Currency;
begin
asm FINIT end;
try
if rlTotal <> 0 then
result:= rlAmount * (rlSubTotal / rlTotal)
else
result:= 0;
except
result:= 0;
end;
end
А ЭТО НЕРАБОТАЮЩИЙ:
function CalcProportionAsAmount(rlTotal, rlSubTotal, rlAmount : Currency) : Currency;
begin
asm FINIT end;
try
result:= rlAmount * (rlSubTotal / rlTotal);
except
result:= 0;
end;
end
На моем компе я проверяю с моим принтером. То есть всё также много вопросов - всё те же.
Прошу прокомментировать.
← →
12 © (2011-01-18 09:48) [44]
> когда
> в функции идет деление на ноль, то программа не идет на
> except, а присваивает результату вот такое больше разрядное
> значение.
Вероятно, там не 0, а несколько больше(меньше).
function CalcProportionAsAmount(rlTotal, rlSubTotal, rlAmount : Currency) : Currency;
const
Eps = 0.0001;
begin
try
if (rlTotal > Eps) then
result:= rlAmount * (rlSubTotal / rlTotal)
else
result:= 0;
except
result:= 0;
end;
end;
Григорьев Антон, "Невероятные особенности вещественных чисел" , как-то так, гуглите, короче
← →
Amoeba_ (2011-01-18 11:47) [45]
> Григорьев Антон, "Невероятные особенности вещественных чисел"
> , как-то так, гуглите, короче
Неочевидные особенности вещественных чисел
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=374
← →
12 © (2011-01-18 15:51) [46]да-да
var
R:Single;
begin
R:=0.1;
if R=0.1 then
Label1.Caption:="Равно" else
Label1.Caption:="Не равно"
end;
При нажатии кнопки мы увидим надпись «Не равно». На первый взгляд это кажется абсурдом.
(с) Антон Григорьев
из этой же серии, имхо
← →
12 © (2011-01-18 16:21) [47]еще раз тему перечитал - тогда так: Компьютер портит.
Без компьютера же программа не лажает?!
Вот.. :)
А чтоб программа не лажала - ее надо отлаживать (с)
Страницы: 1 2 вся ветка
Форум: "Начинающим";
Текущий архив: 2011.04.24;
Скачать: [xml.tar.bz2];
Память: 0.53 MB
Время: 0.004 c