I was asked for some GAMS code that produces the number of decimals provided in a table column. One should realize that a number like 0.1 is not exactly representable in binary, so we need to apply a certain tolerance. Here is what I came up with:
sets i /i1*i4/ j /j1*j4/ ; table data(i,j) j1 j2 j3 j4 i1 1 0.1 0.01 100.0001 i2 2 2 0.01 0.01 i3 3 3 0.01 0.01 i4 4 4 0.01 0.01 ; * * find number of decimals * parameter numdec(j) 'number of decimals'; numdec(j)=0; loop((i,j), while(abs(round(data(i,j),numdec(j))-data(i,j))>1.0e-15, numdec(j) = numdec(j) + 1; ) ); option data:5; option numdec:0; display data, numdec; |
This produces:
---- 27 PARAMETER data j1 j2 j3 j4 i1 1.00000 0.10000 0.01000 100.00010 j2 1, j3 2, j4 4 |
The first column has integers so the number of decimals is zero for that column.
No comments:
Post a Comment