Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Scientific Notation
#9
(11-10-2022, 04:02 PM)bplus Wrote: Yeah but expensive in LOC and there always seems to be something else you need to fix!
Here we need a rounder and that usually needs to convert number back from string.
Code: (Select All)
_Title "N2S$ Test Steve's converter for number display" ' b+ 2022-11-10

Dim a As Double
For i = 1 To 10
    a = a + .01
    Print a; Tab(40); N2S$(Str$(a)) ' Bombs at iteration 7.
Next

Dim b As Single
For i = 1 To 10
    b = b + .01
    Print b; Tab(40); N2S$(Str$(b)) ' Bombs at iteration 10.
Next

' call N2S$(Str$(YourNumberOfAnyType))
Function N2S$ (EXP$) 'remove scientific Notation to String (~40 LOC)
    'SMcNeill Jan 7, 2020 ref: https://www.qb64.org/forum/index.php?topic=1555.msg112989#msg112989
    'Last Function in code marked Best Answer (removed debug comments and blank lines added these 2 lines.)
    ReDim t$, sign$, l$, r$, r&&
    ReDim dp As Long, dm As Long, ep As Long, em As Long, check1 As Long, l As Long, i As Long
    t$ = LTrim$(RTrim$(EXP$))
    If Left$(t$, 1) = "-" Or Left$(t$, 1) = "N" Then sign$ = "-": t$ = Mid$(t$, 2)
    dp = InStr(t$, "D+"): dm = InStr(t$, "D-")
    ep = InStr(t$, "E+"): em = InStr(t$, "E-")
    check1 = Sgn(dp) + Sgn(dm) + Sgn(ep) + Sgn(em)
    If check1 < 1 Or check1 > 1 Then N2S = _Trim$(EXP$): Exit Function 'If no scientic notation is found, or if we find more than 1 type, it's not SN!
    Select Case l 'l now tells us where the SN starts at.
        Case Is < dp: l = dp
        Case Is < dm: l = dm
        Case Is < ep: l = ep
        Case Is < em: l = em
    End Select
    l$ = Left$(t$, l - 1) 'The left of the SN
    r$ = Mid$(t$, l + 1): r&& = Val(r$) 'The right of the SN, turned into a workable long
    If InStr(l$, ".") Then 'Location of the decimal, if any
        If r&& > 0 Then
            r&& = r&& - Len(l$) + 2
        Else
            r&& = r&& + 1
        End If
        l$ = Left$(l$, 1) + Mid$(l$, 3)
    End If
    Select Case r&&
        Case 0 'what the heck? We solved it already?
            'l$ = l$
        Case Is < 0
            For i = 1 To -r&&
                l$ = "0" + l$
            Next
            l$ = "." + l$
        Case Else
            For i = 1 To r&&
                l$ = l$ + "0"
            Next
            l$ = l$
    End Select
    N2S$ = sign$ + l$
End Function

Another case solved by string math!
Must always use the result of "STR$()" into the function Steve wrote. I just tried "1e-6" and "N2S$()" returned the same thing. The "D" or "E" to indicate exponent must be uppercase letter. No problem, saying this for people who are used to coding in C, Lua and other languages that prefer lowercase stuff.

(11-10-2022, 09:55 AM)Pete Wrote: PRINT USING and FIX() are a couple of workarounds but for better reliability across a large number spectrum you need to consider using something like my string math routine, ...
This is a scientist's tendency, must be most accurate, try to find the end of PI because there's a beginning... Rolleyes
Reply


Messages In This Thread
Scientific Notation - by james2464 - 11-10-2022, 04:27 AM
RE: Scientific Notation - by BSpinoza - 11-10-2022, 04:56 AM
RE: Scientific Notation - by james2464 - 11-10-2022, 05:31 AM
RE: Scientific Notation - by Pete - 11-10-2022, 09:55 AM
RE: Scientific Notation - by bplus - 11-10-2022, 04:02 PM
RE: Scientific Notation - by mnrvovrfc - 11-10-2022, 04:52 PM
RE: Scientific Notation - by james2464 - 11-10-2022, 03:54 PM
RE: Scientific Notation - by bplus - 11-10-2022, 04:36 PM
RE: Scientific Notation - by Pete - 11-10-2022, 04:41 PM
RE: Scientific Notation - by bplus - 11-10-2022, 05:18 PM
RE: Scientific Notation - by Pete - 11-10-2022, 05:37 PM
RE: Scientific Notation - by SMcNeill - 11-10-2022, 08:03 PM
RE: Scientific Notation - by bplus - 11-10-2022, 08:43 PM
RE: Scientific Notation - by Pete - 11-10-2022, 09:40 PM



Users browsing this thread: 2 Guest(s)