I have written the following function, that effectively adjusts rounding errors. The code appears to get stuck in a while loop despite the condition of sum(roundedAssetAllocation) == 1. Could someone help to explain why?
function [a, n] = fixRounding(x, s) u = 10.^-s; n = length(x); assetAllocation = x/sum(x); roundedAssetAllocation = round(assetAllocation, s); while sum(roundedAssetAllocation) ~= 1 diffFromUnrounded = assetAllocation - roundedAssetAllocation; if sum(roundedAssetAllocation) < 1 [~, index] = max(diffFromUnrounded); roundedAssetAllocation(index) = roundedAssetAllocation(index) + u; elseif sum(roundedAssetAllocation) > 1 [~, index] = min(diffFromUnrounded); roundedAssetAllocation(index) = roundedAssetAllocation(index) - u; end a = roundedAssetAllocation; end end
The following call should return: [.3485, .1198, .1356, .1761, .2200], but it instead gets stuck in a loop.
fixRounding([0.837746777686794, 0.287856637640281, 0.325810457772455, 0.423276428672838, 0.528787529659317], 4)
Best Answer