' RTHMTC.TMR - simulating the four arithmetic operations via strings, written back in 90's by Kaze, (sanmayce@sanmayce.com)

'DECLARE SUB DelNull (Result(), Tiller$, DimLength)
'DECLARE SUB DelLeftNull (Result(), Tiller$, StrLength, DimLength, PointPos)
'DECLARE SUB DelRightNull (Result(), Tiller$, StrLength, PointPos)
'DECLARE SUB Convert (Array(), Number$, Length, Flag, PointPos)
'DECLARE FUNCTION FindIntegerPart$ (Dividend$, Divisor$)
'DECLARE FUNCTION DIV$ (Dividend$, Divisor$, Exactness)
'DECLARE FUNCTION ADD$ (FirstAddend$, SecondAddend$)
'DECLARE FUNCTION SUBqb$ (Minuend$, Subtrahend$)
'DECLARE FUNCTION MUL$ (Multiplicand$, Multiplier$)
'DECLARE FUNCTION Compare (Firum$, Secum$)
'DECLARE FUNCTION ResultFilter$ (Result(), Code$, DimLength, PointPos, Sign)

$SCREENHIDE
$CONSOLE
_CONSOLE ON
_CONSOLETITLE "Fibonacci dumper"
_DEST _CONSOLE

' Examples [
'PRINT ADD$("123.89", "3")
'PRINT SUBqb$("-3", "3")
'PRINT MUL$("-0.4", "222222222222222222222222222222222222")
'PRINT DIV$("22.7", "-3", 10)
'Examples ]

' Talking about shifted Fibonacci sequence...
' Since Fibbonacci series starts at 0 this series is sometimes called shifted Fibonacci sequence F0=1,F1=1,F2=2,F3=3,F4=5,... where Fn=Fn-1+Fn-2,n>=2.
' For
'
' 1x^0 + 1x^1 + 2x^2 + 3x^3 + 5x^4 + 8x^5 + 13x^6 + ... = 1/(1-x-x^2)
'
'      inf
' F(x)=Sum(F_n*x^n)
'      n=0
'
' the coefficients are Fibonacci numbers, i.e., the sequence {1,1,2,3,5,8,13,...}.
'
' Let x=10^(-f) then above function is identical to:
' F(10^(-f))= 1 / (1-10^(-f)-10^(-2f)) = 10^(2f) / (10^(2f)-10^(f)-1)
'
' Or, 1/(1-1/100-1/10000)= 1.010203050813213455 = 10000/(10000-100-1)

'PRINT DIV$("1", "9899", 60) ' (10000-100-1)=9899
'PRINT DIV$("1", "998999", 60) ' (1000000-1000-1)=998999

INPUT "Input the maximum digits (i.e. the group size) = ", d3
INPUT "Input the iterations = ", d4
TimeA = TIMER
OPEN "groups_of_" + LTRIM$(STR$(d3)) + "-digits.txt" FOR OUTPUT AS #1
d1$ = "1"
d2$ = STRING$(d3 - 1, "9") + "8" + STRING$(d3, "9")
PRINT "Dividing ( DividendLength="; LEN(d1$); ", DivisorLength="; LEN(d2$); ", DigitsAfterDecimalPoint="; d3 * d4; ") ..."
ResultNotWrapped$ = DIV$(d1$, d2$, d3 * d4)

ResultNotWrapped$ = RIGHT$(ResultNotWrapped$, LEN(ResultNotWrapped$) - 2) '-2 due to "0." removal
DO WHILE LEN(ResultNotWrapped$) > d3
    PRINT #1, LEFT$(ResultNotWrapped$, d3)
    ResultNotWrapped$ = RIGHT$(ResultNotWrapped$, LEN(ResultNotWrapped$) - d3)
LOOP
TimeB = TIMER
ElapsedTime% = TimeB - TimeA
IF ElapsedTime% < 0 THEN ElapsedTime% = (86400 - TimeA) + TimeB
PRINT "Done in "; LTRIM$(STR$(ElapsedTime%)); " seconds."
SYSTEM

'This is the 999th number in the Fibonacci sequence, just in case you were wondering. (self.CasualMath):
'F_0 = 0 as the first, F_1 = 1 as the second, ... F_999 (209 digits) = 26,863,810,024,485,359,386,146,727,202,142,923,967,616,609,318,986,952,340,123,175,997,617,981,700,247,881,689,338,369,654,483,356,564,191,827,856,161,443,356,312,976,673,642,210,350,324,634,850,410,377,680,367,334,151,172,899,169,723,197,082,763,985,615,764,450,078,474,174,626
'If we are assuming that the first and second terms are both 1, then the 1000th term is:
'43466557686937456435688527675040625802564660517371780402481729089536555417949051890403879840079255169295922593080322634775209689623239873322471161642996440906533187938298969649928516003704476137795166849228875
'F_9999 (2090 digits) = 20,793,608,237,133,498,072,112,648,988,642,836,825,087,036,094,015,903,119,682,945,866,528,501,423,455,686,648,927,456,034,305,226,515,591,757,343,297,190,158,010,624,794,267,250,973,176,133,810,179,902,738,038,231,789,748,346,235,556,483,191,431,591,924,532,394,420,028,067,810,320,408,724,414,693,462,849,062,668,387,083,308,048,250,920,654,493,340,878,733,226,377,580,847,446,324,873,797,603,734,794,648,258,113,858,631,550,404,081,017,260,381,202,919,943,892,370,942,852,601,647,398,213,554,479,081,823,593,715,429,566,945,149,312,993,664,846,779,090,437,799,284,773,675,379,284,270,660,175,134,664,833,266,377,698,642,012,106,891,355,791,141,872,776,934,080,803,504,956,794,094,648,292,880,566,056,364,718,187,662,668,970,758,537,383,352,677,420,835,574,155,945,658,542,003,634,765,324,541,006,121,012,446,785,689,171,494,803,262,408,602,693,091,211,601,973,938,229,446,636,049,901,531,963,286,159,699,077,880,427,720,289,235,539,329,671,877,182,915,643,419,079,186,525,118,678,856,821,600,897,520,171,070,499,437,657,067,342,400,871,083,908,811,800,976,259,727,431,820,539,554,256,869,460,815,355,918,458,253,398,234,382,360,435,762,759,823,179,896,116,748,424,269,545,924,633,204,614,137,992,850,814,352,018,738,480,923,581,553,988,990,897,151,469,406,131,695,614,497,783,720,743,461,373,756,218,685,106,856,826,090,696,339,815,490,921,253,714,537,241,866,911,604,250,597,353,747,823,733,268,178,182,198,509,240,226,955,826,416,016,690,084,749,816,072,843,582,488,613,184,829,905,383,150,180,047,844,353,751,554,201,573,833,105,521,980,998,123,833,253,261,228,689,824,051,777,846,588,461,079,790,807,828,367,132,384,798,451,794,011,076,569,057,522,158,680,378,961,532,160,858,387,223,882,974,380,483,931,929,541,222,100,800,313,580,688,585,002,598,879,566,463,221,427,820,448,492,565,073,106,595,808,837,401,648,996,423,563,386,109,782,045,634,122,467,872,921,845,606,409,174,360,635,618,216,883,812,562,321,664,442,822,952,537,577,492,715,365,321,134,204,530,686,742,435,454,505,103,269,768,144,370,118,494,906,390,254,934,942,358,904,031,509,877,369,722,437,053,383,165,360,388,595,116,980,245,927,935,225,901,537,634,925,654,872,380,877,183,008,301,074,569,444,002,426,436,414,756,905,094,535,072,804,764,684,492,105,680,024,739,914,490,555,904,391,369,218,696,387,092,918,189,246,157,103,450,387,050,229,300,603,241,611,410,707,453,960,080,170,928,277,951,834,763,216,705,242,485,820,801,423,866,526,633,816,082,921,442,883,095,463,259,080,471,819,329,201,710,147,828,025,221,385,656,340,207,489,796,317,663,278,872,207,607,791,034,431,700,112,753,558,813,478,888,727,503,825,389,066,823,098,683,355,695,718,137,867,882,982,111,710,796,422,706,778,536,913,192,342,733,364,556,727,928,018,953,989,153,106,047,379,741,280,794,091,639,429,908,796,650,294,603,536,651,238,230,626
'F_66619 =~ 1.578x10^13922

DEFLNG A-Z
FUNCTION ADD$ (FirstAddend$, SecondAddend$)
    FiradLength = LEN(FirstAddend$)
    SecadLength = LEN(SecondAddend$)
    FirstSign$ = MID$(FirstAddend$, 1, 1)
    SecondSign$ = MID$(SecondAddend$, 1, 1)
    IF FirstSign$ <> "-" AND SecondSign$ = "-" THEN
        Mediator$ = RIGHT$(SecondAddend$, SecadLength - 1)
        ADD$ = SUBqb$(FirstAddend$, Mediator$)
        EXIT FUNCTION
    END IF
    IF FirstSign$ = "-" AND SecondSign$ <> "-" THEN
        Mediator$ = RIGHT$(FirstAddend$, FiradLength - 1)
        ADD$ = SUBqb$(SecondAddend$, Mediator$)
        EXIT FUNCTION
    END IF
    IF FirstSign$ = "-" AND SecondSign$ = "-" THEN
        Sign = 1
        FiradLength = FiradLength - 1
        SecadLength = SecadLength - 1
        FirstAddend$ = RIGHT$(FirstAddend$, FiradLength)
        SecondAddend$ = RIGHT$(SecondAddend$, SecadLength)
    END IF
    REDIM Firad(1 TO FiradLength)
    REDIM Secad(1 TO SecadLength)
    CALL Convert(Firad(), FirstAddend$, FiradLength, FiradFlag, FiradPointPos)
    FiradTrueLength = FiradLength - FiradPointPos
    CALL Convert(Secad(), SecondAddend$, SecadLength, SecadFlag, SecadPointPos)
    SecadTrueLength = SecadLength - SecadPointPos
    IF SecadTrueLength > FiradTrueLength THEN
        BigLength = SecadTrueLength
    ELSE
        BigLength = FiradTrueLength
    END IF
    IF FiradPointPos > SecadPointPos THEN
        BigPointPos = FiradPointPos
        TrueBigPointPos = BigPointPos - FiradFlag
        SubSecad = SecadPointPos - SecadFlag - TrueBigPointPos
    ELSE
        BigPointPos = SecadPointPos
        TrueBigPointPos = BigPointPos - SecadFlag
        SubFirad = FiradPointPos - FiradFlag - TrueBigPointPos
    END IF
    DimSum = BigLength + TrueBigPointPos + 1
    REDIM Result(1 TO DimSum)
    FOR SF = 1 TO BigLength + BigPointPos
        FiradDim = 0
        SecadDim = 0
        SubFirad = SubFirad + 1
        SubSecad = SubSecad + 1
        IF SubFirad > 0 AND SubFirad <= FiradLength THEN FiradDim = Firad(SubFirad)
        IF SubSecad > 0 AND SubSecad <= SecadLength THEN SecadDim = Secad(SubSecad)
        Result(SF) = FiradDim + SecadDim + Result(SF)
        IF Result(SF) >= 10 THEN
            Result(SF + 1) = 1
            Result(SF) = Result(SF) - 10
        END IF
    NEXT SF
    ADD$ = ResultFilter$(Result(), "ADD", DimSum, BigPointPos, Sign)
END FUNCTION

FUNCTION Compare (Firum$, Secum$)
    FirLeftPart = INSTR(Firum$, ".")
    SecLeftPart = INSTR(Secum$, ".")
    IF FirLeftPart = 0 THEN
        FirLeftPart = LEN(Firum$)
    ELSE
        FirLeftPart = FirLeftPart - 1
        FirRightPart = LEN(Firum$) - FirLeftPart
    END IF
    IF SecLeftPart = 0 THEN
        SecLeftPart = LEN(Secum$)
    ELSE
        SecLeftPart = SecLeftPart - 1
        SecRightPart = LEN(Secum$) - SecLeftPart
    END IF
    IF SecRightPart > FirRightPart THEN
        MainRightPart = FirRightPart
    ELSE
        MainRightPart = SecRightPart
    END IF
    IF SecLeftPart > FirLeftPart THEN
        CompareCode = -1
        MainLeftPart = SecLeftPart
    ELSE
        CompareCode = 1
        MainLeftPart = FirLeftPart
    END IF
    IF SecLeftPart = FirLeftPart THEN
        CompareCode = 0
        DO
            Counter = Counter + 1
            FirumPart = VAL(MID$(Firum$, Counter, 1))
            SecumPart = VAL(MID$(Secum$, Counter, 1))
            IF FirumPart > SecumPart THEN CompareCode = 1
            IF FirumPart < SecumPart THEN CompareCode = -1
        LOOP WHILE Counter < MainLeftPart AND FirumPart = SecumPart
        IF CompareCode = 0 THEN
            MainLength = MainLeftPart + MainRightPart
            IF MainRightPart > 0 THEN
                Counter = Counter + 1
                DO
                    Counter = Counter + 1
                    FirumPart = VAL(MID$(Firum$, Counter, 1))
                    SecumPart = VAL(MID$(Secum$, Counter, 1))
                    IF FirumPart > SecumPart THEN CycleFlag = 1: CompareCode = 1
                    IF FirumPart < SecumPart THEN CycleFlag = 1: CompareCode = -1
                LOOP WHILE Counter < MainLength AND FirumPart = SecumPart
            END IF
            IF Counter = MainLength AND CycleFlag = 0 THEN
                IF FirRightPart < SecRightPart THEN CompareCode = -1
                IF FirRightPart > SecRightPart THEN CompareCode = 1
            END IF
        END IF
    END IF
    Compare = CompareCode
END FUNCTION

SUB Convert (Array(), Number$, Length, Flag, PointPos)
    FOR Counter = 1 TO Length
        Shoot$ = MID$(Number$, Length - Counter + 1, 1)
        IF Shoot$ = "." THEN
            Flag = 1
            PointPos = Counter
            Counter = Counter + 1
            Shoot$ = MID$(Number$, Length - Counter + 1, 1)
        END IF
        Array(Counter - Flag) = VAL(Shoot$)
    NEXT Counter
END SUB

SUB DelLeftNull (Result(), Tiller$, StrLength, DimLength, PointPos)
    Counter = DimLength
    DeviPart = DimLength + 1 - StrLength
    DO WHILE PointPos + 1 <= Counter - DeviPart AND Result(Counter) = 0
        StrLength = StrLength - 1
        Tiller$ = RIGHT$(Tiller$, StrLength)
        Counter = Counter - 1
    LOOP
END SUB

SUB DelNull (Result(), Tiller$, DimLength)
    Counter = DimLength
    DO WHILE Result(Counter) = 0 AND Counter >= 2
        Tiller$ = RIGHT$(Tiller$, Counter - 1)
        Counter = Counter - 1
    LOOP
END SUB

SUB DelRightNull (Result(), Tiller$, StrLength, PointPos)
    Counter = 1
    NewPointPos = PointPos
    DO WHILE PointPos - 2 >= Counter AND Result(Counter) = 0
        StrLength = StrLength - 1
        Tiller$ = LEFT$(Tiller$, StrLength)
        Counter = Counter + 1
        NewPointPos = NewPointPos - 1
    LOOP
    PointPos = NewPointPos
END SUB

FUNCTION DIV$ (Dividend$, Divisor$, Exactness)
    DendSign$ = MID$(Dividend$, 1, 1)
    SorSign$ = MID$(Divisor$, 1, 1)
    IF DendSign$ = "-" AND SorSign$ <> "-" THEN
        Sign = 1
        Dividend$ = RIGHT$(Dividend$, LEN(Dividend$) - 1)
    END IF
    IF DendSign$ <> "-" AND SorSign$ = "-" THEN
        Sign = 1
        Divisor$ = RIGHT$(Divisor$, LEN(Divisor$) - 1)
    END IF
    IF DendSign$ = "-" AND SorSign$ = "-" THEN
        Divisor$ = RIGHT$(Divisor$, LEN(Divisor$) - 1)
        Dividend$ = RIGHT$(Dividend$, LEN(Dividend$) - 1)
    END IF
    DendPointPos = INSTR(Dividend$, ".")
    SorPointPos = INSTR(Divisor$, ".")
    IF DendPointPos <> 0 THEN
        DendRightPart = LEN(Dividend$) - DendPointPos
        DendRightPart$ = RIGHT$(Dividend$, DendRightPart)
        Dividend$ = LEFT$(Dividend$, DendPointPos - 1) + DendRightPart$
    END IF
    IF SorPointPos <> 0 THEN
        SorRightPart = LEN(Divisor$) - SorPointPos
        SorRightPart$ = RIGHT$(Divisor$, SorRightPart)
        Divisor$ = LEFT$(Divisor$, SorPointPos - 1) + SorRightPart$
    END IF
    DO WHILE MID$(Dividend$, 1, 1) = "0" AND LEN(Dividend$) <> 1
        Dividend$ = RIGHT$(Dividend$, LEN(Dividend$) - 1)
    LOOP
    DO WHILE MID$(Divisor$, 1, 1) = "0" AND LEN(Divisor$) <> 1
        Divisor$ = RIGHT$(Divisor$, LEN(Divisor$) - 1)
    LOOP
    IF Divisor$ = "0" THEN ERROR 11
    DendLength = LEN(Dividend$)
    SorLength = LEN(Divisor$)
    IF DendLength <= SorLength THEN
        Tiller$ = Dividend$
        Mediator$ = FindIntegerPart$(Dividend$, Divisor$)
        IntegerPart$ = Mediator$
    ELSE
        Pointer = SorLength
        Tiller$ = MID$(Dividend$, 1, Pointer)
        IF FindIntegerPart$(Tiller$, Divisor$) = "0" THEN
            Pointer = SorLength + 1
            Tiller$ = MID$(Dividend$, 1, Pointer)
        END IF
        DO WHILE Pointer < DendLength
            Mediator$ = FindIntegerPart$(Tiller$, Divisor$)
            IntegerPart$ = IntegerPart$ + Mediator$
            Pointer = Pointer + 1
            Shoot$ = MUL$(Mediator$, Divisor$)
            Deviation$ = SUBqb$(Tiller$, Shoot$)
            IF Deviation$ = "0" THEN
                Tiller$ = MID$(Dividend$, Pointer, 1)
            ELSE
                Tiller$ = Deviation$ + MID$(Dividend$, Pointer, 1)
            END IF
        LOOP
        Mediator$ = FindIntegerPart$(Tiller$, Divisor$)
        IntegerPart$ = IntegerPart$ + Mediator$
    END IF
    Result$ = IntegerPart$
    RelativePosition = DendRightPart - SorRightPart
    MiddlePosition = LEN(IntegerPart$) - RelativePosition
    CycleLength = Exactness - RelativePosition
    IF CycleLength > 0 THEN
        FOR I = 1 TO CycleLength
            Shoot$ = MUL$(Mediator$, Divisor$)
            Deviation$ = SUBqb$(Tiller$, Shoot$)
            IF Deviation$ = "0" THEN Tiller$ = "0" ELSE Tiller$ = Deviation$ + "0"
            Mediator$ = FindIntegerPart$(Tiller$, Divisor$)
            FractionalPart$ = FractionalPart$ + Mediator$
        NEXT I
        Result$ = Result$ + FractionalPart$
    END IF
    IF MiddlePosition > 0 THEN
        LeftPart$ = LEFT$(Result$, MiddlePosition)
        IF Exactness = 0 THEN
            Result$ = LeftPart$
        ELSE
            RightPart$ = RIGHT$(Result$, LEN(Result$) - MiddlePosition)
            Result$ = LeftPart$ + "." + RightPart$
        END IF
        IF DendLength <= SorLength THEN
            'Below lines for what captain.
            'NullNumber = SorLength - DendLength + 1 'Bug appears here
            '                                        'because +1 or +0 must.
            'IF MiddlePosition > NullNumber THEN
            'DelLength = NullNumber
            'ELSEIF MiddlePosition = NullNumber THEN
            'DelLength = NullNumber - 1
            'ELSEIF MiddlePosition > 1 THEN
            'DelLength = MiddlePosition - 1
            'END IF
            'Result$ = RIGHT$(Result$, LEN(Result$) - DelLength)
            DO WHILE LEN(Result$) >= 2
                IF LEFT$(Result$, 1) = "0" AND MID$(Result$, 2, 1) <> "." THEN
                    Result$ = RIGHT$(Result$, LEN(Result$) - 1)
                ELSE
                    EXIT DO
                END IF
            LOOP
        END IF
    ELSE
        IF MiddlePosition = 0 THEN
            Result$ = "0." + Result$
        ELSE
            Result$ = "0." + STRING$(ABS(MiddlePosition), "0") + Result$
        END IF
        IF Exactness = 0 THEN
            Result$ = "0"
        ELSEIF CycleLength < 0 THEN
            Result$ = LEFT$(Result$, 2 + Exactness)
        END IF
    END IF
    IF Sign = 1 THEN DIV$ = "-" + Result$ ELSE DIV$ = Result$
END FUNCTION

FUNCTION FindIntegerPart$ (Dividend$, Divisor$)
    DO
        Counter = Counter + 1
        Digit$ = LTRIM$(STR$(Counter))
        Tiller$ = MUL$(Digit$, Divisor$)
        CompareCode = Compare(Tiller$, Dividend$)
    LOOP WHILE Counter <= 9 AND CompareCode = -1
    FindIntegerPart$ = LTRIM$(STR$(Counter - CompareCode))
END FUNCTION

FUNCTION MUL$ (Multiplicand$, Multiplier$)
    CandSign$ = MID$(Multiplicand$, 1, 1)
    ErSign$ = MID$(Multiplier$, 1, 1)
    CandLength = LEN(Multiplicand$)
    ErLength = LEN(Multiplier$)
    IF CandSign$ = "-" AND ErSign$ <> "-" THEN
        Sign = 1
        CandLength = CandLength - 1
        Multiplicand$ = RIGHT$(Multiplicand$, CandLength)
    END IF
    IF CandSign$ <> "-" AND ErSign$ = "-" THEN
        Sign = 1
        ErLength = ErLength - 1
        Multiplier$ = RIGHT$(Multiplier$, ErLength)
    END IF
    IF CandSign$ = "-" AND ErSign$ = "-" THEN
        ErLength = ErLength - 1
        CandLength = CandLength - 1
        Multiplier$ = RIGHT$(Multiplier$, ErLength)
        Multiplicand$ = RIGHT$(Multiplicand$, CandLength)
    END IF
    REDIM Cand(1 TO CandLength)
    REDIM Er(1 TO ErLength)
    CALL Convert(Cand(), Multiplicand$, CandLength, CandFlag, CandPointPos)
    CALL Convert(Er(), Multiplier$, ErLength, ErFlag, ErPointPos)
    DimSum = CandLength + ErLength - CandFlag - ErFlag
    PointPos = CandPointPos + ErPointPos - CandFlag - ErFlag
    REDIM Result(1 TO DimSum)
    FOR SF = 1 TO CandLength - CandFlag
        FOR QB = 1 TO ErLength - ErFlag
            CarryFlag = 0
            Cycle = QB - 1 + SF
            Tiller = Cand(SF) * Er(QB)
            Result(Cycle) = Tiller MOD 10 + Result(Cycle)
            IF Result(Cycle) >= 10 THEN
                Result(Cycle) = Result(Cycle) - 10
                CarryFlag = 1
            END IF
            NextNumPos = Cycle + 1
            Result(NextNumPos) = Result(NextNumPos) + CarryFlag + Tiller \ 10
            DO WHILE Result(NextNumPos) >= 10
                Result(NextNumPos) = Result(NextNumPos) - 10
                NextNumPos = NextNumPos + 1
                Result(NextNumPos) = Result(NextNumPos) + 1
            LOOP
        NEXT QB
    NEXT SF
    MUL$ = ResultFilter$(Result(), "MUL", DimSum, PointPos, Sign)
END FUNCTION

FUNCTION ResultFilter$ (Result(), Code$, DimLength, PointPos, Sign)
    SELECT CASE Code$
        CASE "ADD"
            FOR I = 1 TO DimLength - 1
                IF I = PointPos THEN Tiller$ = "." + Tiller$
                Tiller$ = LTRIM$(STR$(Result(I))) + Tiller$
            NEXT I
            IF Result(DimLength) <> 0 THEN
                Tiller$ = LTRIM$(STR$(Result(DimLength))) + Tiller$
            END IF
            IF PointPos <> 0 THEN
                StrLength = LEN(Tiller$)
                CALL DelRightNull(Result(), Tiller$, StrLength, PointPos)
            END IF
            IF Sign = 1 THEN Tiller$ = "-" + Tiller$
        CASE "SUB"
            FOR I = 1 TO DimLength
                IF I = PointPos THEN Tiller$ = "." + Tiller$
                Tiller$ = LTRIM$(STR$(Result(I))) + Tiller$
            NEXT I
            IF PointPos <> 0 THEN
                StrLength = LEN(Tiller$)
                CALL DelRightNull(Result(), Tiller$, StrLength, PointPos)
                CALL DelLeftNull(Result(), Tiller$, StrLength, DimLength, PointPos)
            ELSE
                CALL DelNull(Result(), Tiller$, DimLength)
            END IF
            IF Sign = -1 THEN Tiller$ = "-" + Tiller$
        CASE "MUL"
            FOR I = 1 TO DimLength
                Tiller$ = LTRIM$(STR$(Result(I))) + Tiller$
                IF I = PointPos THEN Tiller$ = "." + Tiller$
            NEXT I
            IF Result(DimLength) = 0 THEN
                IF PointPos = 0 THEN
                    Tiller$ = RIGHT$(Tiller$, DimLength - 1)
                    IF MID$(Tiller$, 1, 1) = "0" THEN Tiller$ = "0"
                ELSE
                    PointPos = PointPos + 1
                    Tiller$ = RIGHT$(Tiller$, DimLength)
                    StrLength = LEN(Tiller$)
                    TrueDimLength = StrLength - 1
                    CALL DelRightNull(Result(), Tiller$, StrLength, PointPos)
                    CALL DelLeftNull(Result(), Tiller$, StrLength, TrueDimLength, PointPos)
                END IF
            END IF
            IF Sign = 1 THEN Tiller$ = "-" + Tiller$
    END SELECT
    IF RIGHT$(Tiller$, 2) = ".0" THEN Tiller$ = LEFT$(Tiller$, LEN(Tiller$) - 2)
    IF Tiller$ = "-0" THEN Tiller$ = "0"
    ResultFilter$ = Tiller$
END FUNCTION

FUNCTION SUBqb$ (Minuend$, Subtrahend$)
    MinuSign$ = MID$(Minuend$, 1, 1)
    SubtraSign$ = MID$(Subtrahend$, 1, 1)
    MinuLength = LEN(Minuend$)
    SubtraLength = LEN(Subtrahend$)
    IF MinuSign$ = "-" AND SubtraSign$ <> "-" THEN
        Mediator$ = RIGHT$(Minuend$, MinuLength - 1)
        SUBqb$ = "-" + ADD$(Mediator$, Subtrahend$)
        EXIT FUNCTION
    END IF
    IF MinuSign$ <> "-" AND SubtraSign$ = "-" THEN
        Mediator$ = RIGHT$(Subtrahend$, SubtraLength - 1)
        SUBqb$ = ADD$(Minuend$, Mediator$)
        EXIT FUNCTION
    END IF
    IF MinuSign$ = "-" AND SubtraSign$ = "-" THEN
        SWAP Minuend$, Subtrahend$
        MinuLength = MinuLength - 1
        SubtraLength = SubtraLength - 1
        Minuend$ = RIGHT$(Minuend$, MinuLength)
        Subtrahend$ = RIGHT$(Subtrahend$, SubtraLength)
    END IF
    REDIM Minu(1 TO MinuLength)
    REDIM Subtra(1 TO SubtraLength)
    CALL Convert(Minu(), Minuend$, MinuLength, MinuFlag, MinuPointPos)
    MinuTrueLength = MinuLength - MinuPointPos
    CALL Convert(Subtra(), Subtrahend$, SubtraLength, SubtraFlag, SubtraPointPos)
    SubtraTrueLength = SubtraLength - SubtraPointPos
    IF SubtraTrueLength > MinuTrueLength THEN
        MainTrueLength = SubtraTrueLength
    ELSE
        MainTrueLength = MinuTrueLength
    END IF
    CompareCode = Compare(Minuend$, Subtrahend$)
    IF CompareCode = -1 THEN Sign = -1 ELSE Sign = 1
    IF MinuPointPos < SubtraPointPos THEN
        BigPointPos = SubtraPointPos
        TrueBigPointPos = BigPointPos - SubtraFlag
        MinuSub = MinuPointPos - MinuFlag - TrueBigPointPos
    ELSE
        BigPointPos = MinuPointPos
        TrueBigPointPos = BigPointPos - MinuFlag
        SubtraSub = SubtraPointPos - SubtraFlag - TrueBigPointPos
    END IF
    DimSum = MainTrueLength + TrueBigPointPos
    REDIM Result(1 TO DimSum)
    FOR SF = 1 TO DimSum
        MinuDim = 0
        SubtraDim = 0
        MinuSub = MinuSub + 1
        SubtraSub = SubtraSub + 1
        IF MinuSub > 0 AND MinuSub <= MinuLength - MinuFlag THEN
            MinuDim = Minu(MinuSub)
        END IF
        IF SubtraSub > 0 AND SubtraSub <= SubtraLength - SubtraFlag THEN
            SubtraDim = Subtra(SubtraSub)
        END IF
        IF Sign = 1 THEN
            MinuDim = MinuDim + SubFlag
        ELSE
            SubtraDim = SubtraDim + SubFlag
        END IF
        SubSum = Sign * (MinuDim - SubtraDim)
        SubFlag = 0
        IF Sign = 1 THEN
            IF MinuDim >= SubtraDim THEN
                Result(SF) = SubSum
            ELSE
                IF SubSum < 0 THEN SubFlag = -1
                Result(SF) = SubSum + 10
            END IF
        ELSE
            IF MinuDim > SubtraDim THEN
                IF SubSum < 0 THEN SubFlag = -1
                Result(SF) = SubSum + 10
            ELSE
                Result(SF) = SubSum
            END IF
        END IF
    NEXT SF
    SUBqb$ = ResultFilter$(Result(), "SUB", DimSum, BigPointPos, Sign)
END FUNCTION

