Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2006.07.23;
Скачать: [xml.tar.bz2];

Вниз

Пример в орешник.   Найти похожие ветки 

 
Сатир   (2006-06-22 13:44) [0]

Вчера наткнулся в коде на место, которое называется "тяжелое наследство", ибо досталось по наследству.) А то, что оно глючит, выяснилось только через полтора года:-)
а вот и сам код:

function Conv(cs: double; numb: integer): double;
var
 { db,db1,}db2: double;
 i: int64;
 ii, ink, i1: integer;
 //          st: string;
begin
 //  db:=cs-int(cs);
 ink := 1;
 for ii := 1 to numb do
   ink := ink * 10;
 //    db1:=db*ink;
 db2 := cs * ink * 100;
 i := trunc(int(db2) / 100);
 i1 := trunc(db2 - i * 100);
 if abs(i1) > 49 then
   inc(i);
 result := i / ink;
end;

все коментарии сохранены для более полного представления образа мышления аффтара)
А теперь вопрос на засыпку:
1) что делает данная ф-ция?
2)в каком месте она глючит?
3)перепишите одной строчкой с минимумов операций деления и умножения
%)


 
tesseract ©   (2006-06-22 13:49) [1]


> Сатир   (22.06.06 13:44) 


что-то из Div/mod похоже.


 
Сатир   (2006-06-22 13:52) [2]


> что-то из Div/mod похоже.

неа


 
StriderMan ©   (2006-06-22 13:55) [3]

округление до заданного количества знаков?


 
Сатир   (2006-06-22 13:56) [4]


> округление до заданного количества знаков?

ага
а где ошибка?


 
StriderMan ©   (2006-06-22 13:58) [5]

в ДНК :))


 
Skyle ©   (2006-06-22 13:58) [6]

Госспидя, округление..... O^O


 
Danilka ©   (2006-06-22 14:00) [7]

что-то типа того, когда numb = 5, а в cs - сумма в рублях, сия ф-я сделает сумму в тысячах рублей, и ищщо 2 знака после запятой?
:)


 
Skyle ©   (2006-06-22 14:02) [8]


> Сатир   (22.06.06 13:56) [4]
>
> > округление до заданного количества знаков?
>
> ага
> а где ошибка?


Отрицательные числа?


 
Danilka ©   (2006-06-22 14:02) [9]

ой, нет, что-то другое :) какое-то другое, более извращенное округление :)


 
Сатир   (2006-06-22 14:02) [10]


> в ДНК :))

неправильно округляет отрицательные числа.
например -0,29999 округляет к -0,2

вот мой вариант, (принимаются более оптимизированные варианты;):

function Conv(cs: double; numb: integer): double;
begin
 result:=round(cs*power(10,numb))/power(10,numb);
end;


 
Сатир   (2006-06-22 14:03) [11]


> Отрицательные числа?

ты знал)))


 
Сатир   (2006-06-22 14:05) [12]


> //          st: string;

судя по этому коменту, аффтар собирался превращать число в строку, а потом копировать из неё необходимое число знаков после запятой.
Но похоже ниасилил)))


 
Skyle ©   (2006-06-22 14:07) [13]


> Сатир   (22.06.06 14:02) [10]
>
> > в ДНК :))
>
> неправильно округляет отрицательные числа.
> например -0,29999 округляет к -0,2
>
> вот мой вариант, (принимаются более оптимизированные варианты;
> ):
>
> function Conv(cs: double; numb: integer): double;
> begin
>  result:=round(cs*power(10,numb))/power(10,numb);
> end;



Этот вариант неправильный.

Conv(2.5, 0)
> Сатир   (22.06.06 14:03) [11]
>
> > Отрицательные числа?
>
> ты знал)))

Чесслово, не знал ;-))


 
Думкин ©   (2006-06-22 14:11) [14]

> Сатир   (22.06.06 14:05) [12]


function RoundTo(const AValue: Double; const ADigit: TRoundToRange): Double;
var
 LFactor: Double;
begin
 LFactor := IntPower(10, ADigit);
 Result := Round(AValue / LFactor) * LFactor;
end;

Поэтому в Дельфи, короткий вариант пишется:
uses Math;
RoundTo(-,-);


 
stone ©   (2006-06-22 14:13) [15]


> принимаются более оптимизированные варианты

RoundTo


 
Rouse_ ©   (2006-06-22 14:21) [16]

Я бы показал наши округления, где хошь не хочешь АСМ пришлось использовать.

К примеру следующе числа округлить до двух значащих чисел:
12345.67890 = 12000
123.4567890 = 120
1.234567890 = 1.2
0.123456789 = 0.12
0.001234567 = 0.0012

А есть еще и с оставлением целой части :)


 
Внук ©   (2006-06-22 14:23) [17]

>>Сатир   (22.06.06 13:44)
 А, вероятно, за такой код автору было еще и заплачено?


 
ПЛОВ ©   (2006-06-22 14:54) [18]

:)


 
TUser ©   (2006-06-22 15:11) [19]

> А то, что оно глючит, выяснилось только через полтора года


> например -0,29999 округляет к -0,2

Много ли денег тебе эта функция сэкономила?)


 
Сатир   (2006-06-22 15:21) [20]


> А, вероятно, за такой код автору было еще и заплачено?

не знаю, какая у него была з/п, но 4 месяца что-то стругал.

> Много ли денег тебе эта функция сэкономила?)

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

RoundTo отличается от моей только вызовом IntPower заместо Power


 
Сатир   (2006-06-22 15:24) [21]

но за RoundTo всё равно пасибо;)


 
Rule ©   (2006-06-22 15:25) [22]

Сатир   (22.06.06 15:21) [20]
ну дык зачем тогда городить велосипед, если все уже есть ???


 
Skyle ©   (2006-06-22 15:37) [23]


> Сатир   (22.06.06 15:21) [20]
> RoundTo отличается от моей только вызовом IntPower заместо
> Power


Ты увидел, что твоя функция неправильная?
Ну или "особенная"?
(у меня там что-то форматирование слетело, не видно толком в [13])

Не по-русски работает ;-)


 
Сатир   (2006-06-22 16:49) [24]


> Ты увидел, что твоя функция неправильная?
> Ну или "особенная"?

чем она неправильная?
если вводишь 0 знаков после запятой, то получится без дробной части, как и просили.
другое дело, что IntPower работает быстрее и введен ограничительный тип TRoundToRange, который контролирует входящие значения.
Но сама логика ИМХО ничем не отличается, только у них начала делять а потом умножают.


 
Vlad ©   (2006-06-22 17:18) [25]


> Сатир   (22.06.06 14:02) [10]
>
> > в ДНК :))
>
> неправильно округляет отрицательные числа.
> например -0,29999 округляет к -0,2


в Дельфи тоже есть функция которая неверно округляет отрицательные числа - SimpleRoundTo :-)


 
Rule ©   (2006-06-22 17:52) [26]

Vlad ©   (22.06.06 17:18) [25]
она верно оклугляет в соответствии с заданым тобою режимом округления, не помню какую там системную переменную дергать нада


 
Vlad ©   (2006-06-22 18:00) [27]


> Rule ©   (22.06.06 17:52) [26]

Нет, там в коде ошибка


 
Думкин ©   (2006-06-23 05:59) [28]

> Vlad ©   (22.06.06 17:18) [25]

В соответствии со справкой.

> Rule ©   (22.06.06 17:52) [26]

Note: The behavior of Round can be affected by the Set8087CW procedure or SetRoundMode function.

Это имелось в виду?


 
Vlad ©   (2006-06-23 11:05) [29]


> Думкин ©   (23.06.06 05:59) [28]


т.е. если в справке написано, значит баг считаем фичей? :-)

А про вот это в справке ничего не написано :-(
SimpleRoundTo(1.005, -2) -> 1.00

это баг или фича? :-)


 
McSimm ©   (2006-06-23 11:09) [30]


> это баг или фича? :-)

Это не баг.
0.5 -> 0; 1.5 -> 2
Или переключаем флаг сопроцессора


 
Думкин ©   (2006-06-23 11:11) [31]

Нет. Это религия.


 
Vlad ©   (2006-06-23 11:17) [32]


> McSimm ©   (23.06.06 11:09) [30]


> 0.5 -> 0; 1.5 -> 2
> Или переключаем флаг сопроцессора


Куда переключаем?

SimpleRoundTo uses asymmetric arithmetic rounding to determine how to round values that are exactly midway between the two values that have the desired number of significant digits. This method always rounds to the larger value.


 
Vlad ©   (2006-06-23 11:19) [33]

Set8087CW ничего не даст.


 
Думкин ©   (2006-06-23 11:21) [34]

Значит фича. :) Только 1,005 - положительное, а вы писали:

в Дельфи тоже есть функция которая неверно округляет отрицательные числа - SimpleRoundTo :-)


 
McSimm ©   (2006-06-23 11:27) [35]


> Vlad ©   (23.06.06 11:17) [32]

Тогда "ой".
(
Я с этой функцией не сталкивался, видать она появилась уже после того, как я перестал программировать на Delphi :)
)


 
Vlad ©   (2006-06-23 11:28) [36]


> Думкин ©   (23.06.06 11:21) [34]

Да, я считаю что это неверно, хоть и в справке описано.
Во всяком случае не могу себе представить кому и зачем может понадобиться такая "фича" с отрицательными числами.
Может кто-то разъяснит? :-)


 
Danilka ©   (2006-06-23 11:30) [37]

[36] Vlad ©   (23.06.06 11:28)
Если имеецца ввиду то, что чаще всего нада округлять именно деньги, то, хочу заметить, не все сделки бывают прибыльными. :)


 
Vlad ©   (2006-06-23 12:12) [38]

Вот более интересный пример:
SimpleRoundTo(-1.4, 0) -> 0

хорошая фича :-)


> Danilka ©   (23.06.06 11:30) [37]

бывает что недоимка (+) а переплата (-), так можно и разориться :-)


 
Думкин ©   (2006-06-23 12:29) [39]

> Vlad ©   (23.06.06 12:12) [38]

Понятно. С +0,5 они погорячились.


 
Rule ©   (2006-06-23 16:57) [40]

Думкин ©   (23.06.06 5:59) [28]
Это имелось в виду?

точно :-)



Страницы: 1 2 вся ветка

Форум: "Прочее";
Текущий архив: 2006.07.23;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.54 MB
Время: 0.017 c
2-1151896293
Kobik..
2006-07-03 07:11
2006.07.23
Разбивание RGB на R, G и B. Скорость.


2-1151943068
Vudu
2006-07-03 20:11
2006.07.23
Печать нескольких страниц


2-1151306326
XTD
2006-06-26 11:18
2006.07.23
Автоответчик (модем+комп)


2-1151941702
Вася
2006-07-03 19:48
2006.07.23
png не расстянуть


3-1148024824
Jan_ab
2006-05-19 11:47
2006.07.23
Суммирование по месяцам





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский