function InfiniteAdd(mNumberA, mNumberB: string): string;
var
I: Integer;
T: Integer;
begin
Result := '';
if Pos('.', mNumberA) <= 0 then mNumberA := mNumberA + '.';
if Pos('.', mNumberB) <= 0 then mNumberB := mNumberB + '.';
I := Max(Length(StrLeft(mNumberA, '.')), Length(StrLeft(mNumberB, '.')));
mNumberA := DupeString('0', I - Length(StrLeft(mNumberA, '.'))) + mNumberA;
mNumberB := DupeString('0', I - Length(StrLeft(mNumberB, '.'))) + mNumberB;
T := Max(Length(StrRight(mNumberA, '.')), Length(StrRight(mNumberB, '.')));
mNumberA := mNumberA + DupeString('0', T - Length(StrRight(mNumberA, '.')));
mNumberB := mNumberB + DupeString('0', T - Length(StrRight(mNumberB, '.')));
I := I + T + 1;
T := 0;
for I := I downto 1 do
if [mNumberA[I], mNumberB[I]] <> ['.'] then begin
T := StrToIntDef(mNumberA[I], 0) + T;
T := StrToIntDef(mNumberB[I], 0) + T;
Result := IntToStr(T mod 10) + Result;
T := T div 10;
end else Result := '.' + Result;
if T <> 0 then Result := IntToStr(T mod 10) + Result;
while Pos('0', Result) = 1 do Delete(Result, 1, 1);
while Copy(Result, Length(Result), 1) = '0' do
Delete(Result, Length(Result), 1);
if Copy(Result, Length(Result), 1) = '.' then
Delete(Result, Length(Result), 1);
if Copy(Result, 1, 1) = '.' then Result := '0' + Result;
if (Result = '') then Result := '0';
end;