green_fr: (Default)
[personal profile] green_fr
В нашей программе в какой-то момент нужно разделить портфель актива на две части. Известен размер одной части N, отпиливаем все активы пропорционально, чтобы в сумме была эта сумма, а во второй остаётся сдача. В силу архитектуры программы, идёт два вызова метода setPartPortefeuille (обожаю наш franglais) у двух изначально идентичных объектов. Первому передаётся N, он откусывает себе N. Второму передаётся -N, и он оставляет себе всё, кроме N. В коде, конечно же, первой строчкой if (N > 0).

Вчера весь день сидел и пытался понять, почему не работает, казалось бы, простой тест. Тест заключался в N = 0...

Сэкономил одну переменную, блин. День работы коту под хвост.
Поставил себе TODO: переписать setPartPortefeuille(N) на setPartPortefeuille(N, sign).
А в качестве временного решения в тесте поставил N = 1 :-)

Date: 2014-09-23 08:25 am (UTC)
From: [identity profile] grave--digger.livejournal.com
Так, а теперь объясни мне, зачем ты вторрой параметр для метода вводил вместо того, чтобы убрать if (N>0)?

Date: 2014-09-23 08:37 am (UTC)
From: [identity profile] green-fr.livejournal.com
Так там код же ж
if (N > 0)
откусить N
else
оставить (всё - N)
end
Проблема именно в том, что вместо того, чтобы откусить 0 в первой части и оставить всё во второй, он два раза брал себе 0 - в процессе распила на две части терялся весь портфель.

Date: 2014-09-23 08:51 am (UTC)
From: [identity profile] grave--digger.livejournal.com
Так, за обедом объяснишь, почему портфель терялся вместо того, чтобы остаться неизменным. :) Ведь если из "всё" вычесть 0, то останется "всё".

Date: 2014-09-23 09:12 am (UTC)
From: [identity profile] green-fr.livejournal.com
Если ты два раза вызываешь тот метод с N и -N, но при этом N=0, то оба вызова идут с нулём (плюс ноль и минус ноль). То есть, оба раза ты идёшь в одну и ту же ветку if'а. Дальше в зависимости от реализации - либо ты два раза оставляешь себе 0 (мой вариант), либо два раза оставляешь "всё кроме нуля" (удваивается портфель). Проблема именно в отсутствии знака у нуля. А у меня знак был смыслоразделителем. Откуда и решение - выделить этот смысл в отдельную переменную, чтобы точно его определять.

Date: 2014-09-23 03:22 pm (UTC)
From: [identity profile] oldjackaroo.livejournal.com
Срочно побежал снимать $0.00 с каждого из своих счетов! :)

(А по хорошему, вторая переменная должна называться не sign, а, например, withdraw (true/false), или как там одна из операция называется. А совсем по-хорошему, это вообще должен быть enum :) )

Date: 2014-09-23 05:54 pm (UTC)
From: [identity profile] green-fr.livejournal.com
Не сыпь мне соль на рану. Это MatLab, там вообще типов данных нет, какой enum!

Profile

green_fr: (Default)
green_fr

April 2026

S M T W T F S
    1 2 34
56 7 8 9 1011
12131415161718
19202122232425
2627282930  

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Apr. 12th, 2026 01:24 pm
Powered by Dreamwidth Studios