Tema: Apie double() tikslumą
Autorius: Grzegorz Brzęczyszczykiewicz
Data: 2020-07-04 01:59:26
Toks įsimenantis gavo atvejis :)

Veiksmas Matlab, poliruoju kodą ir dedu saugiklius.
'w' yra svorių vektorius, jo elementų suma turi būti 1, kitaip vėliau 
rezultatai pabyra. Ir kartais yra sprendžiamas dalinia uždavinys, t.y. 
iš didelės užduoties iškerpamas gabalas duomenų, bet svorių koeficientai 
rankomis neperskaičiuojami, tuo užsiima kompiuteris.

Saugantis kodo gabalas:
if sum(w) ~= 1
   error('[func]: sum of Weights must be equal to 1, not %10.8f', sum(w));
end


Taigi, imam dalinį uždavinį:

 >> w = [0.0260 0.0300 0.0900 0.1000 0.0803];
 >> sum(w) = 0.326300000000000

Ištampom koeficientus, gal ir neteisingai, bet tai ne mano problema:
 >> w = w + (1-sum(w))/size(w,2);
 >> sum(w)=1.000000000000000


 >> sum(w) ~= 1

ans =

   logical

    1

WUT?

 >> sum(w)*10

ans =

    9.999999999999998

 >> sum(w)*50

ans =

   49.999999999999993

Nenuostabu kad saugantis kodo gabalas išmeta iš funkcijos, bet klaudos 
ptanešimas "[func]: sum of Weights must be equal to 1, not 1.00000000" 
yra nepadorus galutiniam vartotojui. Net ir pakeitus į "%14.12f" gaunu 
"[func]: sum of Weights must be equal to 1, not 1.000000000000"

Išvada - remontuojam 'w' skaičiavimą:
% ir apeinam 'double' tikslumo problemą
  w(size(w,2)) = 1-sum(w(1:size(w,2)-1));

Viskas važiuoja, bet suėdė valandą gyvenimo:)

-- 
Grzegorz

Chrząszczyrzewoszyce, powiat Łękołody