And now I've finally managed to reliably reproduce the EXP function.
The EXP values are calculated at the game startup once and stored inside a table as 64-bit integer values. During the gameplay, the code simply looks into the table to obtain the EXP required to reach a certain level, and works from here.
Unit's ENEXT isn't actually stored in the unit description, it is obtained as a difference between the next EXP threshold and current accumulated EXP of the unit each time it's requested.
Analogously, as EXP yield of a slain enemy is determined by the maximum possible ENEXT of its level, this value is obtained as a difference between the consecutive EXP thresholds. For that purpose, the game also stores EXP for level 10000 - you can't reach it, but for level 9999 enemies to yield EXP, there must be a gap between their total EXP and the next level's one.
Interestingly, when the game first fills the table, the values are obtained with floating-point arithmetic, and then rounded. Disgaea PC in particular uses
x87 instructions in the calculation, which give slightly different results than PS versions of the game (unless PSs had 80-bit FPUs as well, and I doubt they did), though they don't affect gameplay in any noticeable way.
Another side effect of using x87 is that the operations are becoming a pain to make sense of; it took me long enough to just replicate the disassembly in an actual C++ program. Though, since I did, I guess I could give
the table that I got already.
Lastly, a little useless fact: the constants used are stored with double precision in the game code, but their actual values are upconverted from single precision. If instead of
4.92f you write 4.92, the resulting values start to diverge a little, reaching about 200 EXP in difference at level 10000.