home *** CD-ROM | disk | FTP | other *** search
/ Planet Source Code Jumbo …e CD Visual Basic 1 to 7 / 1_2002.ISO / Data / Zips / CODE_UPLOAD15905342001.psc / modCalculate.bas < prev    next >
Encoding:
BASIC Source File  |  2001-03-04  |  21.3 KB  |  838 lines

  1. Attribute VB_Name = "modCalculate"
  2. Option Explicit
  3.  
  4. Dim AngleMode As Integer
  5. Dim InError As Boolean
  6. Dim LogBase As Double
  7.  
  8. Dim Char As String
  9. Dim CurrentEntryIndex As Integer
  10. Dim InputString As String
  11. Dim OutputString As String
  12. Dim OutputValue As Double
  13. Dim Value As Double
  14. Dim ValueString As String
  15.  
  16. Const Pi = 3.14159265358979
  17.  
  18. Public Function CalculateString(IString As String, AMode As Integer, BaseMode As Integer, Decimals As Integer, LBase As Double)
  19. On Error GoTo ErrorHandler:
  20. Dim Answer As String
  21. Dim BinAnswer As String
  22. Dim DecimalCheck As Long
  23. Dim i As Integer
  24. Dim LenAfterDecimal As Long
  25. Dim Remainder As String
  26.  
  27.     'If nothing was entered, exit
  28.     If IString = "" Then
  29.         CalculateString = "Error: Nothing entered"
  30.         Exit Function
  31.     End If
  32.  
  33.     'Set values
  34.     AngleMode = AMode
  35.     CurrentEntryIndex = 1
  36.     InError = False
  37.     InputString = IString
  38.     LogBase = LBase
  39.  
  40.     'Start calculation routine
  41.     ExtractToken
  42.     Answer = GetE()
  43.  
  44.     'Load error into returned variable
  45.     If InError Then
  46.         CalculateString = OutputString
  47.         Exit Function
  48.     End If
  49.  
  50.     Select Case BaseMode
  51.         Case 0 'Decimal
  52.  
  53.             '14 decimals and above are floating
  54.             If Decimals < 14 Then
  55.  
  56.                 'Check for decimal
  57.                 DecimalCheck = InStr(1, CStr(Answer), ".")
  58.  
  59.                 'If decimal does not exist, tag on the number
  60.                 'of zeroes that the user specified
  61.                 If DecimalCheck = 0 Then
  62.                     If Decimals <> "0" Then
  63.                         Answer = Answer + "."
  64.                         For i = 1 To Decimals
  65.                             Answer = Answer + "0"
  66.                         Next i
  67.                     End If
  68.  
  69.                 'If decimal does exist, adjust the answer to
  70.                 'the number of decimal places that the user
  71.                 'specified
  72.                 Else
  73.                     LenAfterDecimal = Len(Answer) - DecimalCheck
  74.                     If LenAfterDecimal > Decimals Then
  75.                         If Decimals = "0" Then
  76.                             DecimalCheck = DecimalCheck - 1
  77.                         End If
  78.                         Answer = Mid(Answer, 1, DecimalCheck + Decimals)
  79.                     Else
  80.                         For i = 1 To (Decimals - LenAfterDecimal)
  81.                             Answer = Answer + "0"
  82.                         Next i
  83.                     End If
  84.                 End If
  85.             End If
  86.  
  87.         Case 1 'Binary
  88.  
  89.             If CDbl(Answer) <= 32767 Then
  90.                 BinAnswer = ""
  91.                 DecimalCheck = InStr(1, CStr(Answer), ".")
  92.                 If DecimalCheck <> 0 Then
  93.                     If CInt(Mid(CStr(Answer), DecimalCheck + 1, 1)) < 5 Then
  94.                         Answer = CDbl(Left(Answer, DecimalCheck - 1))
  95.                     Else
  96.                         Answer = CDbl(Left(Answer, DecimalCheck - 1)) + 1
  97.                     End If
  98.                 End If
  99.                 Do
  100.                     Answer = Answer / 2
  101.                     DecimalCheck = InStr(1, CStr(Answer), ".")
  102.                     If DecimalCheck = 0 Then
  103.                         Remainder = "0"
  104.                     Else
  105.                         Answer = CDbl(Left(Answer, DecimalCheck - 1))
  106.                         Remainder = "1"
  107.                     End If
  108.                     BinAnswer = Remainder + BinAnswer
  109.                 Loop Until Answer < 1
  110.                 Answer = CDbl(BinAnswer)
  111.             End If
  112.  
  113.         Case 2 'Hexadecimal
  114.  
  115.             Answer = Hex(Answer)
  116.  
  117.         Case 3 'Octal
  118.  
  119.             Answer = Oct(Answer)
  120.  
  121.     End Select
  122.  
  123.     'Display final answer
  124.     CalculateString = Answer
  125.  
  126.     Exit Function
  127.  
  128. ErrorHandler:
  129.  
  130.     'Trap errors
  131.     TrapErrors Err.Number
  132.  
  133. End Function
  134.  
  135. Private Sub ExtractToken()
  136. Dim i As Integer
  137.  
  138.     'Set default values
  139.     OutputString = ""
  140.     OutputValue = 0
  141.     ValueString = ""
  142.  
  143.     'If at the end of string, return EOS
  144.     If CurrentEntryIndex > Len(InputString) Then
  145.         OutputString = "EOS"
  146.         Exit Sub
  147.     End If
  148.  
  149.     'Get character to be examined
  150.     Char = Mid(InputString, CurrentEntryIndex, 1)
  151.  
  152.     'Space
  153.     If Char = " " Then
  154.         CurrentEntryIndex = CurrentEntryIndex + 1
  155.         ExtractToken
  156.         Exit Sub
  157.     End If
  158.  
  159.     'Operator or parenthesis
  160.     If Char = "+" Or Char = "-" Or Char = "*" Or Char = "/" Or Char = "^" Or Char = "(" Or Char = ")" Or Char = "!" Then
  161.         CurrentEntryIndex = CurrentEntryIndex + 1
  162.  
  163.         'Set return value
  164.         OutputString = Char
  165.         Exit Sub
  166.     End If
  167.  
  168.     'Number
  169.     If (Char >= "0" And Char <= "9") Or Char = "." Then
  170.  
  171.         'Digits before decimal
  172.         While Char >= "0" And Char <= "9"
  173.             ValueString = ValueString + Char
  174.             CurrentEntryIndex = CurrentEntryIndex + 1
  175.             If CurrentEntryIndex <= Len(InputString) Then
  176.                 Char = Mid(InputString, CurrentEntryIndex, 1)
  177.             Else
  178.                 Char = ""
  179.             End If
  180.         Wend
  181.  
  182.         'Decimal
  183.         While Char = "."
  184.             ValueString = ValueString + Char
  185.             CurrentEntryIndex = CurrentEntryIndex + 1
  186.             If CurrentEntryIndex <= Len(InputString) Then
  187.                 Char = Mid(InputString, CurrentEntryIndex, 1)
  188.             Else
  189.                 Char = ""
  190.             End If
  191.         Wend
  192.  
  193.         'Digits after decimal
  194.         While Char >= "0" And Char <= "9"
  195.             ValueString = ValueString + Char
  196.             CurrentEntryIndex = CurrentEntryIndex + 1
  197.             If CurrentEntryIndex <= Len(InputString) Then
  198.                 Char = Mid(InputString, CurrentEntryIndex, 1)
  199.             Else
  200.                 Char = ""
  201.             End If
  202.         Wend
  203.  
  204.         'Set return values
  205.         OutputString = "Number"
  206.         OutputValue = CDbl(ValueString)
  207.         Exit Sub
  208.     End If
  209.  
  210.     'Return text language identifiers
  211.     If LCase(Char) >= "a" And LCase(Char) <= "z" Then
  212.         While (LCase(Char) >= "a" And LCase(Char) <= "z")
  213.             ValueString = ValueString + Char
  214.             CurrentEntryIndex = CurrentEntryIndex + 1
  215.             If CurrentEntryIndex <= Len(InputString) Then
  216.                 Char = Mid(InputString, CurrentEntryIndex, 1)
  217.             Else
  218.                 Char = ""
  219.             End If
  220.         Wend
  221.  
  222.         'Pi or e
  223.         If LCase(ValueString) = "pi" Or LCase(ValueString) = "e" Then
  224.             OutputString = "Number"
  225.             If LCase(ValueString) = "pi" Then
  226.                 OutputValue = Pi
  227.             Else
  228.                 OutputValue = Exp(1)
  229.             End If
  230.             Exit Sub
  231.         End If
  232.  
  233.         'Set return value
  234.         OutputString = LCase(ValueString)
  235.         Exit Sub
  236.     End If
  237.  
  238. End Sub
  239.  
  240. Private Function GetE()
  241. On Error GoTo ErrorHandler
  242.  
  243.     'Get the lower value (T)
  244.     Value = GetT()
  245.  
  246.     'Exit function if error call returned
  247.     If InError Then
  248.         Exit Function
  249.     End If
  250.  
  251.     'Allow for multiple operators of the same precedence
  252.     'level occuring immediately after each other
  253.     While OutputString = "+" Or OutputString = "-"
  254.  
  255.         Select Case OutputString
  256.     
  257.             'Addition operator
  258.             Case "+"
  259.                 ExtractToken
  260.                 Value = Value + GetT()
  261.     
  262.             'Subraction operator
  263.             Case "-"
  264.                 ExtractToken
  265.                 Value = Value - GetT()
  266.  
  267.         End Select
  268.  
  269.     Wend
  270.  
  271.     'Return value for E
  272.     GetE = Value
  273.  
  274.     'Exit function before error handler
  275.     Exit Function
  276.  
  277. ErrorHandler:
  278.  
  279.     'Trap errors
  280.     TrapErrors Err.Number
  281.  
  282. End Function
  283.  
  284. Private Function GetT()
  285. On Error GoTo ErrorHandler
  286.  
  287.     'Get the lower value (F)
  288.     Value = GetF
  289.  
  290.     'Exit function if error call returned
  291.     If InError Then
  292.         Exit Function
  293.     End If
  294.  
  295.     'Allow for multiple operators of the same precedence
  296.     'level occuring immediately after each other
  297.     While OutputString = "*" Or OutputString = "/"
  298.  
  299.         Select Case OutputString
  300.     
  301.             'Multiplication operator
  302.             Case "*"
  303.                 ExtractToken
  304.                 Value = Value * GetF()
  305.     
  306.             'Division operator
  307.             Case "/"
  308.                 ExtractToken
  309.                 Value = Value / GetF()
  310.     
  311.         End Select
  312.  
  313.     Wend
  314.  
  315.     'Return value for T
  316.     GetT = Value
  317.  
  318.     'Exit function before error handler
  319.     Exit Function
  320.  
  321. ErrorHandler:
  322.  
  323.     'Trap errors
  324.     TrapErrors Err.Number
  325.  
  326. End Function
  327.  
  328. Private Function GetF()
  329. On Error GoTo ErrorHandler
  330.  
  331.     'Handle the low level calculations
  332.     Select Case OutputString
  333.  
  334.         '***************
  335.         'Basic Functions
  336.         '***************
  337.  
  338.         'Number
  339.         Case "Number"
  340.             Value = OutputValue
  341.             ExtractToken
  342.             GetF = PostToken
  343.  
  344.         'Negative
  345.         Case "-"
  346.             ExtractToken
  347.             GetF = -(GetF())
  348.  
  349.         'Random number
  350.         Case "rnd"
  351.             Randomize
  352.             Value = Rnd
  353.             ExtractToken
  354.             GetF = PostToken
  355.  
  356.         'Parenthesis
  357.         Case "("
  358.             ExtractToken
  359.             Value = GetE
  360.             If OutputString <> ")" And OutputString <> "EOS" Then
  361.                 TrapErrors 0
  362.                 Exit Function
  363.             End If
  364.             If OutputString = "EOS" Then
  365.                 GetF = Value
  366.             Else
  367.                 ExtractToken
  368.                 GetF = PostToken
  369.             End If
  370.  
  371.         '*************
  372.         'Miscellaneous
  373.         '*************
  374.  
  375.         'Absolute value
  376.         Case "abs"
  377.             ExtractToken
  378.             Value = GetF()
  379.             If InError Then
  380.                 Exit Function
  381.             Else
  382.                 GetF = Abs(Value)
  383.             End If
  384.  
  385.         'Square Root
  386.         Case "sr"
  387.             ExtractToken
  388.             Value = GetF()
  389.             If InError Then
  390.                 Exit Function
  391.             Else
  392.                 GetF = Sqr(Value)
  393.             End If
  394.  
  395.         '**********
  396.         'Logarithms
  397.         '**********
  398.  
  399.         'Logarithm (to a base)
  400.         Case "log"
  401.  
  402.             'Get logarithm base
  403.             If Not IsNumeric(LogBase) Then
  404.                 TrapErrors (-5)
  405.                 Exit Function
  406.             End If
  407.  
  408.             'Get number
  409.             ExtractToken
  410.             Value = GetF()
  411.             GetF = Log(Value) / Log(LogBase)
  412.  
  413.         'Natural logarithm
  414.         Case "ln"
  415.             ExtractToken
  416.             Value = GetF()
  417.             If InError Then
  418.                 Exit Function
  419.             Else
  420.                 GetF = Log(Value)
  421.             End If
  422.  
  423.         '***********************
  424.         'Trigonometric Functions
  425.         '***********************
  426.  
  427.         'Cosine
  428.         Case "cos"
  429.             ExtractToken
  430.             Value = GetF()
  431.             ConvertToDegrees
  432.             If InError Then
  433.                 Exit Function
  434.             Else
  435.                 GetF = Cos(Value)
  436.             End If
  437.  
  438.         'Cotangent
  439.         Case "cot"
  440.             ExtractToken
  441.             Value = GetF()
  442.             ConvertToDegrees
  443.             If InError Then
  444.                 Exit Function
  445.             Else
  446.                 GetF = 1 / Tan(Value)
  447.             End If
  448.  
  449.         'Cosecant
  450.         Case "csc"
  451.             ExtractToken
  452.             Value = GetF()
  453.             ConvertToDegrees
  454.             If InError Then
  455.                 Exit Function
  456.             Else
  457.                 GetF = 1 / Sin(Value)
  458.             End If
  459.  
  460.         'Hyperbolic cosecant
  461.         Case "hcsc"
  462.             ExtractToken
  463.             Value = GetF()
  464.             ConvertToDegrees
  465.             If InError Then
  466.                 Exit Function
  467.             Else
  468.                 GetF = 2 / (Exp(Value) - Exp(-Value))
  469.             End If
  470.             Exit Function
  471.  
  472.         'Hyperbolic cosine
  473.         Case "hcos"
  474.             ExtractToken
  475.             Value = GetF()
  476.             ConvertToDegrees
  477.             If InError Then
  478.                 Exit Function
  479.             Else
  480.                 GetF = (Exp(Value) + Exp(-Value)) / 2
  481.             End If
  482.  
  483.         'Hyperbolic cotangent
  484.         Case "hcot"
  485.             ExtractToken
  486.             Value = GetF()
  487.             ConvertToDegrees
  488.             If InError Then
  489.                 Exit Function
  490.             Else
  491.                 GetF = (Exp(Value) + Exp(-Value)) / (Exp(Value) - Exp(-Value))
  492.             End If
  493.  
  494.         'Hyperbolic secant
  495.         Case "hsec"
  496.             ExtractToken
  497.             Value = GetF()
  498.             ConvertToDegrees
  499.             If InError Then
  500.                 Exit Function
  501.             Else
  502.                 GetF = 2 / (Exp(Value) + Exp(-Value))
  503.             End If
  504.  
  505.         'Hyperbolic sine
  506.         Case "hsin"
  507.             ExtractToken
  508.             Value = GetF()
  509.             ConvertToDegrees
  510.             If InError Then
  511.                 Exit Function
  512.             Else
  513.                 GetF = (Exp(Value) - Exp(-Value)) / 2
  514.             End If
  515.  
  516.         'Hyperbolic tangent
  517.         Case "htan"
  518.             ExtractToken
  519.             Value = GetF()
  520.             ConvertToDegrees
  521.             If InError Then
  522.                 Exit Function
  523.             Else
  524.                 GetF = (Exp(Value) - Exp(-Value)) / (Exp(Value) + Exp(-Value))
  525.             End If
  526.  
  527.         'Inverse hyperbolic cosine
  528.         Case "ihcos"
  529.             ExtractToken
  530.             Value = GetF()
  531.             If InError Then
  532.                 Exit Function
  533.             Else
  534.                 Value = Log(Value + Sqr(Value * Value - 1))
  535.                 ConvertToRadians
  536.                 GetF = Value
  537.             End If
  538.  
  539.         'Inverse hyperbolic cosecant
  540.         Case "ihcsc"
  541.             ExtractToken
  542.             Value = GetF()
  543.             If InError Then
  544.                 Exit Function
  545.             Else
  546.                 Value = Log((Sgn(Value) * Sqr(Value * Value + 1) + 1) / Value)
  547.                 ConvertToRadians
  548.                 GetF = Value
  549.             End If
  550.  
  551.         'Inverse hyperbolic cotangent
  552.         Case "ihcot"
  553.             ExtractToken
  554.             Value = GetF()
  555.             If InError Then
  556.                 Exit Function
  557.             Else
  558.                 Value = Log((Value + 1) / (Value - 1)) / 2
  559.                 ConvertToRadians
  560.                 GetF = Value
  561.             End If
  562.  
  563.         'Inverse hyperbolic sine
  564.         Case "ihsin"
  565.             ExtractToken
  566.             Value = GetF()
  567.             If InError Then
  568.                 Exit Function
  569.             Else
  570.                 Value = Log(Value + Sqr(Value * Value + 1))
  571.                 ConvertToRadians
  572.                 GetF = Value
  573.             End If
  574.  
  575.         'Inverse hyperbolic secant
  576.         Case "ihsec"
  577.             ExtractToken
  578.             Value = GetF()
  579.             If InError Then
  580.                 Exit Function
  581.             Else
  582.                 Value = Log((Sqr(-Value * Value + 1) + 1) / Value)
  583.                 ConvertToRadians
  584.                 GetF = Value
  585.             End If
  586.  
  587.         'Inverse hyperbolic tangent
  588.         Case "ihtan"
  589.             ExtractToken
  590.             Value = GetF()
  591.             If InError Then
  592.                 Exit Function
  593.             Else
  594.                 Value = Log((1 + Value) / (1 - Value)) / 2
  595.                 ConvertToRadians
  596.                 GetF = Value
  597.             End If
  598.  
  599.         'Inverse cosecant
  600.         Case "icsc"
  601.             ExtractToken
  602.             Value = GetF()
  603.             If InError Then
  604.                 Exit Function
  605.             Else
  606.                 Value = Atn(Value / Sqr(Value * Value - 1)) + (Sgn(Value) - 1) * (2 * Atn(1))
  607.                 ConvertToRadians
  608.                 GetF = Value
  609.             End If
  610.  
  611.         'Inverse cosine
  612.         Case "icos"
  613.             ExtractToken
  614.             Value = GetF()
  615.             If InError Then
  616.                 Exit Function
  617.             Else
  618.                 Value = Atn(-Value / Sqr(-Value * Value + 1)) + 2 * Atn(1)
  619.                 ConvertToRadians
  620.                 GetF = Value
  621.             End If
  622.  
  623.         'Inverse cotangent
  624.         Case "icot"
  625.             ExtractToken
  626.             Value = GetF()
  627.             If InError Then
  628.                 Exit Function
  629.             Else
  630.                 Value = Atn(Value) + 2 * Atn(1)
  631.                 ConvertToRadians
  632.                 GetF = Value
  633.             End If
  634.  
  635.         'Inverse secant
  636.         Case "isec"
  637.             ExtractToken
  638.             Value = GetF()
  639.             If InError Then
  640.                 Exit Function
  641.             Else
  642.                 Value = Atn(Value / Sqr(Value * Value - 1)) + Sgn((Value) - 1) * (2 * Atn(1))
  643.                 ConvertToRadians
  644.                 GetF = Value
  645.             End If
  646.  
  647.         'Inverse sine
  648.         Case "isin"
  649.             ExtractToken
  650.             Value = GetF()
  651.             If InError Then
  652.                 Exit Function
  653.             Else
  654.                 Value = Atn(Value / Sqr(-Value * Value + 1))
  655.                 ConvertToRadians
  656.                 GetF = Value
  657.             End If
  658.  
  659.         'Inverse tangent
  660.         Case "itan"
  661.             ExtractToken
  662.             Value = GetF()
  663.             If InError Then
  664.                 Exit Function
  665.             Else
  666.                 Value = Atn(Value)
  667.                 ConvertToRadians
  668.                 GetF = Value
  669.             End If
  670.  
  671.         'Secant
  672.         Case "sec"
  673.             ExtractToken
  674.             Value = GetF()
  675.             ConvertToDegrees
  676.             If InError Then
  677.                 Exit Function
  678.             Else
  679.                 GetF = 1 / Cos(Value)
  680.             End If
  681.  
  682.         'Sine
  683.         Case "sin"
  684.             ExtractToken
  685.             Value = GetF()
  686.             ConvertToDegrees
  687.             If InError Then
  688.                 Exit Function
  689.             Else
  690.                 GetF = Sin(Value)
  691.             End If
  692.  
  693.         'Tangent
  694.         Case "tan"
  695.             ExtractToken
  696.             Value = GetF()
  697.             ConvertToDegrees
  698.             If InError Then
  699.                 Exit Function
  700.             Else
  701.                 GetF = Tan(Value)
  702.             End If
  703.  
  704.         'Everything not handled is an error
  705.         Case Else
  706.             TrapErrors 0
  707.  
  708.     End Select
  709.  
  710.     'Exit function before error handler
  711.     Exit Function
  712.  
  713. ErrorHandler:
  714.  
  715.     'Trap errors
  716.     TrapErrors Err.Number
  717.  
  718. End Function
  719.  
  720. Private Function PostToken()
  721. On Error GoTo ErrorHandler
  722. Dim Factorial As Double
  723. Dim i As Integer
  724.  
  725.     'Ignore operators, EOS strings, right parentheses, and
  726.     'equals signs
  727.     If OutputString = "+" Or OutputString = "-" Or OutputString = "*" Or OutputString = "/" Or OutputString = "EOS" Or OutputString = ")" Then
  728.         PostToken = Value
  729.  
  730.     'Handle special tokens that come after the value
  731.     Else
  732.         Select Case OutputString
  733.  
  734.             'Factorial
  735.             Case "!"
  736.                 If (CDbl(Value) <> CLng(Value)) Or Value < 0 Then
  737.                     TrapErrors 0
  738.                     Exit Function
  739.                 End If
  740.                 Factorial = 1
  741.                 For i = Value To 1 Step -1
  742.                     Factorial = Factorial * i
  743.                 Next i
  744.                 ExtractToken
  745.  
  746.                 'Ignore operators, EOS strings, right
  747.                 'parentheses, and equals signs
  748.                 If OutputString = "+" Or OutputString = "-" Or OutputString = "*" Or OutputString = "/" Or OutputString = "EOS" Or OutputString = ")" Then
  749.                     PostToken = Factorial
  750.                     ExtractToken
  751.  
  752.                 'Handle special tokens that come after a
  753.                 'factorial
  754.                 Else
  755.  
  756.                     Select Case OutputString
  757.  
  758.                         'Factorial
  759.                         Case "!"
  760.                             TrapErrors 0
  761.                             Exit Function
  762.  
  763.                         'Exponent
  764.                         Case "^"
  765.                             ExtractToken
  766.                             PostToken = Factorial ^ GetF
  767.  
  768.                         'Other "post" tokens multiply
  769.                         Case Else
  770.                             PostToken = Factorial * GetF
  771.                     End Select
  772.                 End If
  773.  
  774.             'Exponent
  775.             Case "^"
  776.                 ExtractToken
  777.                 PostToken = Value ^ GetF
  778.  
  779.             'Left parenthesis
  780.             Case "("
  781.                 PostToken = Value * GetF
  782.  
  783.             'Other "post" tokens multiply
  784.             Case Else
  785.                 PostToken = Value * GetF
  786.         End Select
  787.     End If
  788.  
  789.     'Exit function before error handler
  790.     Exit Function
  791.  
  792. ErrorHandler:
  793.  
  794.     TrapErrors Err.Number
  795.  
  796. End Function
  797.  
  798. Private Sub ConvertToDegrees()
  799.  
  800.     'Convert to degrees
  801.     If AngleMode = 0 Then
  802.         Value = Value * (Pi / 180)
  803.     End If
  804.  
  805. End Sub
  806.  
  807. Private Sub ConvertToRadians()
  808.  
  809.     'Convert to degrees
  810.     If AngleMode = 0 Then
  811.         Value = Value * (180 / Pi)
  812.     End If
  813.  
  814. End Sub
  815.  
  816. Private Sub TrapErrors(ErrNumber As Long)
  817.  
  818.     'Set trapped error message
  819.     Select Case ErrNumber
  820.  
  821.         'VB Runtime Error
  822.         Case Is > 0
  823.             OutputString = "Error " & Err.Number & ": " & Err.Description
  824.  
  825.         Case (-5)
  826.             OutputString = "Error: Invalid logarithm base"
  827.  
  828.         'Trapped runtime calculation error
  829.         Case Else
  830.             OutputString = "Error: General calculation error"
  831.  
  832.     End Select
  833.  
  834.     'Set return value
  835.     InError = True
  836.  
  837. End Sub
  838.