Huge #'s

Just starting out? Need help? Post your questions and find answers here.
User avatar
electrochrisso
Addict
Addict
Posts: 989
Joined: Mon May 14, 2007 2:13 am
Location: Darling River

Re: Huge #'s

Post by electrochrisso »

Working ok here now. :D
PureBasic! Purely the best 8)
User avatar
Guimauve
Enthusiast
Enthusiast
Posts: 742
Joined: Wed Oct 22, 2003 2:51 am
Location: Canada

Re: Huge #'s

Post by Guimauve »

Hello everyone,

The next modification, I will try to replace the Num static array by a linked list. The calculation will probably become little bit slower but the memory management will be better. Allocating a very large static array to overcome the fact that we don't know how many element it's good but not much better.

@Micheal Vogel

In fact the "FormatInteger()" procedure came from another lib and I have add it in my example for convenience but yes why not but something we can do it's to integrate this formatting to the "VogelsNumberFormat_To_String()" with some optional parameter and adjust the "String_To_VogelsNumberFormat()" to remove the formatting before to convert the string into your number format. Maybe for the next version.

Best regards
Guimauve
Dear Optimist, Pessimist,
and Realist,

While you guys were
busy arguing about the
glass of water, I DRANK IT !

Sincerely,
the Opportunist
User avatar
Guimauve
Enthusiast
Enthusiast
Posts: 742
Joined: Wed Oct 22, 2003 2:51 am
Location: Canada

Re: Huge #'s

Post by Guimauve »

Hello everyone,

OK this is the V2.0.0 using Linked List instead of static array. For the moment I have completed only few test and everything seem to work but feel free to push the much further.

Have fun !

Best regards
Guimauve

Code: Select all

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; AUTOMATICALLY GENERATED CODE, DO NOT MODIFY
; UNLESS YOU REALLY, REALLY, REALLY MEAN IT !!
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; Code generated by : Dev-Type V4.0.0
; Project name : Vogels Number Format
; File name : Vogels Number Format.pb
; File Version : 2.0.0
; Programmation : OK
; Programmed by : Guimauve
; Creation Date : 06-07-2012
; Last update : 03-11-2012
; Coded for : PureBasic 5.00 Beta 8
; Platform : Windows, Linux, MacOS X
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; Programming notes : V1.0.2
;
; This code is a re-work of Vogels Number Format orginally 
; created by Michel Vogel (PureBasic English Forum).
;
; List of changes :
;
; - VNF structure name : Renamed to "VogelsNumberFormat"
; - Number() ---> Removed : Use VogelsNumberFormat_To_String() instead
; - GetNumber() ---> Removed : Use VogelsNumberFormat_To_String() instead
; - PutNumber() ---> Removed : Use String_To_VogelsNumberFormat() instead
; 
; Commands added :
; 
; - VogelsNumberFormat_To_String()
; - String_To_VogelsNumberFormat()
; - ReadVogelsNumberFormat()
; - WriteVogelsNumberFormat()
; - VogelsNumberFormat_Factorial() --> Work upto 999!
; - VogelsNumberFormat_Random()
;
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; Programming notes : V2.0.0
; 
; List of changes :
; 
; - Structure field "Len.w" renamed "Status.w"
; - Structure field "Num.l[#]" changed to "List Num.l()"
; - VogelsNumberFormat_To_String() now can optionally space format the number
; - String_To_VogelsNumberFormat() now can manage space formated number
;
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Size Array Constants <<<<<

#VOGELS_NUMBER_FORMAT_NEGATIVE = 1
#VOGELS_NUMBER_FORMAT_POSITIVE = 0

#VOGELS_NUMBER_FORMAT_CORRECT = 0
#VOGELS_NUMBER_FORMAT_UNDEFINED = -1
#VOGELS_NUMBER_FORMAT_INFINITIVE = -2
#VOGELS_NUMBER_FORMAT_OVERFLOW = -3
#VOGELS_NUMBER_FORMAT_NOT_IMPLEMENTED = -4
#VOGELS_NUMBER_FORMAT_LEN = 9
#VOGELS_NUMBER_FORMAT_MOD = 1000000000

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Structure declaration <<<<<

Structure VogelsNumberFormat
  
  Status.w
  Sign.w
  List Num.l()
  
EndStructure

; <<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< The observators <<<<<

Macro GetVogelsNumberFormatStatus(VogelsNumberFormatA)
  
  VogelsNumberFormatA\Status
  
EndMacro

Macro GetVogelsNumberFormatSign(VogelsNumberFormatA)
  
  VogelsNumberFormatA\Sign
  
EndMacro

Macro GetVogelsNumberFormatNum(VogelsNumberFormatA)
  
  VogelsNumberFormatA\Num()
  
EndMacro

; <<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< The mutators <<<<<

Macro SetVogelsNumberFormatStatus(VogelsNumberFormatA, P_Status)
  
  GetVogelsNumberFormatStatus(VogelsNumberFormatA) = P_Status
  
EndMacro

Macro SetVogelsNumberFormatSign(VogelsNumberFormatA, P_Sign)
  
  GetVogelsNumberFormatSign(VogelsNumberFormatA) = P_Sign
  
EndMacro

Macro SetVogelsNumberFormatNum(VogelsNumberFormatA, P_Num)
  
  GetVogelsNumberFormatNum(VogelsNumberFormatA) = P_Num
  
EndMacro

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Complentemary Macros for Linked Lists <<<<<

Macro AddVogelsNumberFormatNumElement(VogelsNumberFormatA)
  
  AddElement(GetVogelsNumberFormatNum(VogelsNumberFormatA))
  
EndMacro

Macro AddVogelsNumberFormatNumElementEx(VogelsNumberFormatA, P_Element)
  
  AddElement(GetVogelsNumberFormatNum(VogelsNumberFormatA))
  SetVogelsNumberFormatNum(VogelsNumberFormatA, P_Element)
  
EndMacro

Macro InsertVogelsNumberFormatNumElement(VogelsNumberFormatA)
  
  InsertElement(GetVogelsNumberFormatNum(VogelsNumberFormatA))
  
EndMacro

Macro InsertVogelsNumberFormatNumElementEx(VogelsNumberFormatA, P_Element)
  
  InsertElement(GetVogelsNumberFormatNum(VogelsNumberFormatA))
  SetVogelsNumberFormatNum(VogelsNumberFormatA, P_Element)
  
EndMacro

Macro SelectVogelsNumberFormatNumElement(VogelsNumberFormatA, Position)
  
  SelectElement(GetVogelsNumberFormatNum(VogelsNumberFormatA), Position)
  
EndMacro

Macro PreviousVogelsNumberFormatNumElement(VogelsNumberFormatA)
  
  PreviousElement(GetVogelsNumberFormatNum(VogelsNumberFormatA))
  
EndMacro

Macro NextVogelsNumberFormatNumElement(VogelsNumberFormatA)
  
  NextElement(GetVogelsNumberFormatNum(VogelsNumberFormatA))
  
EndMacro

Macro FirstVogelsNumberFormatNumElement(VogelsNumberFormatA)
  
  FirstElement(GetVogelsNumberFormatNum(VogelsNumberFormatA))
  
EndMacro

Macro LastVogelsNumberFormatNumElement(VogelsNumberFormatA)
  
  LastElement(GetVogelsNumberFormatNum(VogelsNumberFormatA))
  
EndMacro

Macro PopListVogelsNumberFormatNumPosition(VogelsNumberFormatA)
  
  PopListPosition(GetVogelsNumberFormatNum(VogelsNumberFormatA))
  
EndMacro

Macro PushListVogelsNumberFormatNumPosition(VogelsNumberFormatA)
  
  PushListPosition(GetVogelsNumberFormatNum(VogelsNumberFormatA))
  
EndMacro

Macro DeleteVogelsNumberFormatNumElement(VogelsNumberFormatA, Flag = 0)
  
  DeleteElement(GetVogelsNumberFormatNum(VogelsNumberFormatA), Flag)
  
EndMacro

Macro ListVogelsNumberFormatNumSize(VogelsNumberFormatA)
  
  ListSize(GetVogelsNumberFormatNum(VogelsNumberFormatA))
  
EndMacro

Macro ResetVogelsNumberFormatNumList(VogelsNumberFormatA)
  
  ResetList(GetVogelsNumberFormatNum(VogelsNumberFormatA))
  
EndMacro

Macro ListVogelsNumberFormatNumIndex(VogelsNumberFormatA)
  
  ListIndex(GetVogelsNumberFormatNum(VogelsNumberFormatA))
  
EndMacro

Macro ClearVogelsNumberFormatNumList(VogelsNumberFormatA)
  
  ClearList(GetVogelsNumberFormatNum(VogelsNumberFormatA))
  
EndMacro

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< The Reset operator <<<<<

Macro ResetVogelsNumberFormat(VogelsNumberFormatA)
  
  SetVogelsNumberFormatStatus(VogelsNumberFormatA, 0)
  SetVogelsNumberFormatSign(VogelsNumberFormatA, 0)
  
  ForEach GetVogelsNumberFormatNum(VogelsNumberFormatA)
    SetVogelsNumberFormatNum(VogelsNumberFormatA, 0)
  Next
  
  ClearVogelsNumberFormatNumList(VogelsNumberFormatA)
  
  ClearStructure(VogelsNumberFormatA, VogelsNumberFormat)
  InitializeStructure(VogelsNumberFormatA, VogelsNumberFormat)
  
EndMacro

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< The Copy operator : A = Source : B = Destination <<<<<

Macro CopyVogelsNumberFormat(VogelsNumberFormatA, VogelsNumberFormatB)
  
  SetVogelsNumberFormatStatus(VogelsNumberFormatB, GetVogelsNumberFormatStatus(VogelsNumberFormatA))
  SetVogelsNumberFormatSign(VogelsNumberFormatB, GetVogelsNumberFormatSign(VogelsNumberFormatA))
  CopyList(GetVogelsNumberFormatNum(VogelsNumberFormatA), GetVogelsNumberFormatNum(VogelsNumberFormatB))
  
EndMacro

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Read in Binary file <<<<<

Procedure ReadVogelsNumberFormat(FileID.l, *VogelsNumberFormatA.VogelsNumberFormat)
  
  ResetVogelsNumberFormat(*VogelsNumberFormatA)
  SetVogelsNumberFormatStatus(*VogelsNumberFormatA, ReadWord(FileID))
  SetVogelsNumberFormatSign(*VogelsNumberFormatA, ReadWord(FileID))
  
  Num_Max = ReadLong(FileID)
  
  For NumID = 0 To Num_Max - 1
    AddVogelsNumberFormatNumElement(*VogelsNumberFormatA)
    SetVogelsNumberFormatNum(*VogelsNumberFormatA, ReadLong(FileID))
  Next
  
EndProcedure

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< The Swap operator <<<<<

Procedure SwapVogelsNumberFormat(*VogelsNumberFormatA.VogelsNumberFormat, *VogelsNumberFormatB.VogelsNumberFormat)
  
  InitializeStructure(CopyA.VogelsNumberFormat, VogelsNumberFormat)
  InitializeStructure(CopyB.VogelsNumberFormat, VogelsNumberFormat)
  
  CopyVogelsNumberFormat(*VogelsNumberFormatA, CopyA)
  CopyVogelsNumberFormat(*VogelsNumberFormatB, CopyB)
  
  ResetVogelsNumberFormat(*VogelsNumberFormatA)
  ResetVogelsNumberFormat(*VogelsNumberFormatB)
  
  CopyVogelsNumberFormat(CopyB, *VogelsNumberFormatA)
  CopyVogelsNumberFormat(CopyA, *VogelsNumberFormatB)
  
  ResetVogelsNumberFormat(CopyA)
  ResetVogelsNumberFormat(CopyB)
  
EndProcedure

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Write in Binary file <<<<<

Procedure WriteVogelsNumberFormat(FileID.l, *VogelsNumberFormatA.VogelsNumberFormat)
  
  WriteWord(FileID, GetVogelsNumberFormatStatus(*VogelsNumberFormatA))
  WriteWord(FileID, GetVogelsNumberFormatSign(*VogelsNumberFormatA))
  
  WriteLong(FileID, ListVogelsNumberFormatNumSize(*VogelsNumberFormatA))
  
  ForEach GetVogelsNumberFormatNum(*VogelsNumberFormatA)
    WriteLong(FileID, GetVogelsNumberFormatNum(*VogelsNumberFormatA))
  Next
  
EndProcedure

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Code generated in : 00.008 seconds (29625.00 lines/second) <<<<<
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

Declare VogelsNumberFormat_Add(*VogelsNumberFormatA.VogelsNumberFormat, *VogelsNumberFormatB.VogelsNumberFormat, *VogelsNumberFormatC.VogelsNumberFormat)
Declare VogelsNumberFormat_Sub(*VogelsNumberFormatA.VogelsNumberFormat, *VogelsNumberFormatB.VogelsNumberFormat, *VogelsNumberFormatC.VogelsNumberFormat)

Procedure.s VogelsNumberFormat_To_String(*VogelsNumberFormatA.VogelsNumberFormat, Group.i = 0)
  
  If GetVogelsNumberFormatStatus(*VogelsNumberFormatA) < #VOGELS_NUMBER_FORMAT_CORRECT
    
    Select GetVogelsNumberFormatStatus(*VogelsNumberFormatA)
        
      Case #VOGELS_NUMBER_FORMAT_UNDEFINED
        VFN_2_String.s = "Undefined"
        
      Case #VOGELS_NUMBER_FORMAT_INFINITIVE
        VFN_2_String = "Infinitive"
        If GetVogelsNumberFormatSign(*VogelsNumberFormatA)
          VFN_2_String = "Minus " + VFN_2_String
        EndIf
        
      Case #VOGELS_NUMBER_FORMAT_OVERFLOW
        VFN_2_String = "Overflow"
        
      Case #VOGELS_NUMBER_FORMAT_NOT_IMPLEMENTED
        VFN_2_String = "Not Implemented"
        
    EndSelect
    
    ProcedureReturn VFN_2_String
    
  Else
    
    If LastVogelsNumberFormatNumElement(*VogelsNumberFormatA)
      
      VFN_2_String + Str(GetVogelsNumberFormatNum(*VogelsNumberFormatA))
      
      While PreviousVogelsNumberFormatNumElement(*VogelsNumberFormatA)
        VFN_2_String + RSet(Str(GetVogelsNumberFormatNum(*VogelsNumberFormatA)), #VOGELS_NUMBER_FORMAT_LEN, "0")
      Wend
      
    Else
      VFN_2_String + "0"
    EndIf

    If Group <= 0
      
      If GetVogelsNumberFormatSign(*VogelsNumberFormatA)
        FormatedNumber.s = "-" + VFN_2_String
      Else
        FormatedNumber = VFN_2_String
      EndIf
      
    ElseIf Group >= 1

      NumberLen = Len(VFN_2_String) 
      Start = NumberLen % Group 
      FormatedNumber = Left(VFN_2_String, Start) 
      
      CharsID = Start + 1  
      
      While CharsID <= NumberLen - Start 
        FormatedNumber + " " + Mid(VFN_2_String, CharsID, Group) 
        CharsID + Group 
      Wend 
      
      FormatedNumber = LTrim(FormatedNumber) 
      
      If GetVogelsNumberFormatSign(*VogelsNumberFormatA)
        FormatedNumber = "-" + FormatedNumber
      EndIf

    EndIf
    
    ProcedureReturn FormatedNumber
    
  EndIf
  
EndProcedure

Procedure String_To_VogelsNumberFormat(*VogelsNumberFormatA.VogelsNumberFormat, String.s)
  
  ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  ; We just make sure to start with a new fresh structure
  ; It's just in case some one use the same structured 
  ; variable multiple time. 
  
  ResetVogelsNumberFormat(*VogelsNumberFormatA)
  
  ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  
  SetVogelsNumberFormatSign(*VogelsNumberFormatA, #VOGELS_NUMBER_FORMAT_POSITIVE)
  
  If FindString(String, " ")
    String = RemoveString(String, " ")  
  EndIf
  
  NumID = Len(String) - #VOGELS_NUMBER_FORMAT_LEN
  
  While NumID > 0
    AddVogelsNumberFormatNumElementEx(*VogelsNumberFormatA, Val(Mid(String, NumID + 1, #VOGELS_NUMBER_FORMAT_LEN)))
    NumID - #VOGELS_NUMBER_FORMAT_LEN
  Wend
  
  NumID = Val(Mid(String, 1, 9 + NumID))
  
  If NumID < 0
    SetVogelsNumberFormatSign(*VogelsNumberFormatA, #VOGELS_NUMBER_FORMAT_NEGATIVE)
    NumID = -NumID
  EndIf
  
  AddVogelsNumberFormatNumElementEx(*VogelsNumberFormatA, NumID)
  SetVogelsNumberFormatStatus(*VogelsNumberFormatA, #VOGELS_NUMBER_FORMAT_CORRECT)
  
EndProcedure

Procedure VogelsNumberFormat_Normalize(*VogelsNumberFormatA.VogelsNumberFormat)
  
  ; Strap leading zeros (000.000.000)
  
  If ListVogelsNumberFormatNumSize(*VogelsNumberFormatA) >= 0
    
    LastVogelsNumberFormatNumElement(*VogelsNumberFormatA)
    
    While PreviousVogelsNumberFormatNumElement(*VogelsNumberFormatA) <> #Null
      
      LastVogelsNumberFormatNumElement(*VogelsNumberFormatA)
      
      If GetVogelsNumberFormatNum(*VogelsNumberFormatA) = 0
        DeleteVogelsNumberFormatNumElement(*VogelsNumberFormatA)
      Else
        Break
      EndIf
      
    Wend
    
    ; Value equal Zero? Positive sign
    
    If ListVogelsNumberFormatNumSize(*VogelsNumberFormatA) = 1 And GetVogelsNumberFormatNum(*VogelsNumberFormatA) = 0
      SetVogelsNumberFormatSign(*VogelsNumberFormatA, #VOGELS_NUMBER_FORMAT_POSITIVE)
    EndIf
    
  EndIf
  
EndProcedure

Procedure VogelsNumberFormat_Error(type, stype, *VogelsNumberFormatA.VogelsNumberFormat)
  
  If type >= 0
    type = stype
  EndIf
  
  SetVogelsNumberFormatStatus(*VogelsNumberFormatA, type)
  Debug "ERROR " + Str(type)
  
  ProcedureReturn Type
EndProcedure

Procedure VogelsNumberFormat_Copy(*VogelsNumberFormatA.VogelsNumberFormat, *VogelsNumberFormatB.VogelsNumberFormat)
  
  CopyVogelsNumberFormat(*VogelsNumberFormatA, *VogelsNumberFormatB)
  
EndProcedure

Procedure VogelsNumberFormat_Zero(*VogelsNumberFormatA.VogelsNumberFormat)
  
  ResetVogelsNumberFormat(*VogelsNumberFormatA)
  
  SetVogelsNumberFormatStatus(*VogelsNumberFormatA, #VOGELS_NUMBER_FORMAT_CORRECT)
  SetVogelsNumberFormatSign(*VogelsNumberFormatA, #VOGELS_NUMBER_FORMAT_POSITIVE)
  AddVogelsNumberFormatNumElementEx(*VogelsNumberFormatA, 0)
  
EndProcedure

Procedure VogelsNumberFormat_Abs(*VogelsNumberFormatA.VogelsNumberFormat)
  
  SetVogelsNumberFormatSign(*VogelsNumberFormatA, #VOGELS_NUMBER_FORMAT_POSITIVE)
  
EndProcedure

Procedure VogelsNumberFormat_Equal(*VogelsNumberFormatA.VogelsNumberFormat, *VogelsNumberFormatB.VogelsNumberFormat, Abs = 0)
  
  If ListVogelsNumberFormatNumSize(*VogelsNumberFormatA) <> ListVogelsNumberFormatNumSize(*VogelsNumberFormatB)
    
    ProcedureReturn #False
    
  ElseIf (Abs = 0) And (GetVogelsNumberFormatSign(*VogelsNumberFormatA) <> GetVogelsNumberFormatSign(*VogelsNumberFormatB))
    
    ProcedureReturn #False
    
  Else
    
    FirstVogelsNumberFormatNumElement(*VogelsNumberFormatB)
    
    ForEach GetVogelsNumberFormatNum(*VogelsNumberFormatA)
      
      If GetVogelsNumberFormatNum(*VogelsNumberFormatA) <> GetVogelsNumberFormatNum(*VogelsNumberFormatB)
        ProcedureReturn #False
      EndIf
      
      NextVogelsNumberFormatNumElement(*VogelsNumberFormatB)
      
    Next
    
    ProcedureReturn #True
    
  EndIf
  
EndProcedure

Procedure VogelsNumberFormat_GreaterThan(*VogelsNumberFormatA.VogelsNumberFormat, *VogelsNumberFormatB.VogelsNumberFormat, Abs = 0)
  
  If *VogelsNumberFormatA = *VogelsNumberFormatB
    ProcedureReturn #False
  EndIf
  
  If Abs = 0
    
    If GetVogelsNumberFormatSign(*VogelsNumberFormatA) <> GetVogelsNumberFormatSign(*VogelsNumberFormatB)
      If GetVogelsNumberFormatSign(*VogelsNumberFormatA) = #VOGELS_NUMBER_FORMAT_POSITIVE
        ProcedureReturn #True
      Else
        ProcedureReturn #False
      EndIf
    EndIf
    
  Else
    
    If ListVogelsNumberFormatNumSize(*VogelsNumberFormatA) > ListVogelsNumberFormatNumSize(*VogelsNumberFormatB)
      ProcedureReturn #True
    ElseIf ListVogelsNumberFormatNumSize(*VogelsNumberFormatA) < ListVogelsNumberFormatNumSize(*VogelsNumberFormatB)
      ProcedureReturn #False
    Else
      
      FirstVogelsNumberFormatNumElement(*VogelsNumberFormatB)
      
      ForEach GetVogelsNumberFormatNum(*VogelsNumberFormatA)
        
        Delta = GetVogelsNumberFormatNum(*VogelsNumberFormatA) - GetVogelsNumberFormatNum(*VogelsNumberFormatB)
        
        If Delta > 0
          ProcedureReturn #True
        ElseIf Delta < 0
          ProcedureReturn #False
        EndIf
        
        NextVogelsNumberFormatNumElement(*VogelsNumberFormatB)
        
      Next 
      
      ProcedureReturn #False;    a=b
      
    EndIf
    
  EndIf
  
EndProcedure

Procedure VogelsNumberFormat_Positive(*VogelsNumberFormatA.VogelsNumberFormat)
  
  If GetVogelsNumberFormatSign(*VogelsNumberFormatA) = #VOGELS_NUMBER_FORMAT_POSITIVE
    ProcedureReturn #True
  Else
    ProcedureReturn #False
  EndIf
  
EndProcedure

Procedure VogelsNumberFormat_Mul(*VogelsNumberFormatA.VogelsNumberFormat, *VogelsNumberFormatB.VogelsNumberFormat, *VogelsNumberFormatC.VogelsNumberFormat)
  
  Protected s.q
  
  CopyVogelsNumberFormat(*VogelsNumberFormatA, VNF_Cache_A.VogelsNumberFormat)
  CopyVogelsNumberFormat(*VogelsNumberFormatB, VNF_Cache_B.VogelsNumberFormat)
  
  ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  ; We just make sure to start with a new fresh structure
  ; It's just in case someone use the same structured 
  ; variable multiple time. 
  
  ResetVogelsNumberFormat(*VogelsNumberFormatC)
  
  ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  
  If GetVogelsNumberFormatStatus(VNF_Cache_A) < #VOGELS_NUMBER_FORMAT_CORRECT Or GetVogelsNumberFormatStatus(VNF_Cache_B) < #VOGELS_NUMBER_FORMAT_CORRECT
    Error = VogelsNumberFormat_Error(GetVogelsNumberFormatStatus(VNF_Cache_A), GetVogelsNumberFormatStatus(VNF_Cache_B), *VogelsNumberFormatC)
  Else
    
    SetVogelsNumberFormatSign(*VogelsNumberFormatC, (GetVogelsNumberFormatSign(VNF_Cache_A) + GetVogelsNumberFormatSign(VNF_Cache_B)) & 1)
    
    For Index = 0 To (ListVogelsNumberFormatNumSize(VNF_Cache_A) + ListVogelsNumberFormatNumSize(VNF_Cache_B)) - 1
      AddVogelsNumberFormatNumElementEx(*VogelsNumberFormatC, 0)
    Next 
    
    ForEach GetVogelsNumberFormatNum(VNF_Cache_A)
      ForEach GetVogelsNumberFormatNum(VNF_Cache_B)
        
        C_Index = ListVogelsNumberFormatNumIndex(VNF_Cache_A) + ListVogelsNumberFormatNumIndex(VNF_Cache_B)
        
        SelectVogelsNumberFormatNumElement(*VogelsNumberFormatC, C_Index)
        s = GetVogelsNumberFormatNum(VNF_Cache_A) * GetVogelsNumberFormatNum(VNF_Cache_B) + GetVogelsNumberFormatNum(*VogelsNumberFormatC)
        SetVogelsNumberFormatNum(*VogelsNumberFormatC, s % #VOGELS_NUMBER_FORMAT_MOD)
        SelectVogelsNumberFormatNumElement(*VogelsNumberFormatC, C_Index + 1)
        SetVogelsNumberFormatNum(*VogelsNumberFormatC, GetVogelsNumberFormatNum(*VogelsNumberFormatC) + s / #VOGELS_NUMBER_FORMAT_MOD)
        
      Next
    Next
    
    VogelsNumberFormat_Normalize(*VogelsNumberFormatC)
    
  EndIf
  
  ProcedureReturn Error
EndProcedure

Procedure Private_VogelsNumberFormat_MuW(*VogelsNumberFormatA.VogelsNumberFormat, b.l, *VogelsNumberFormatC.VogelsNumberFormat)
  
  ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  ; We just make sure to start with a new fresh structure
  ; It's just in case someone use the same structured 
  ; variable multiple time. 
  
  ResetVogelsNumberFormat(*VogelsNumberFormatC)
  
  ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  
  If GetVogelsNumberFormatStatus(*VogelsNumberFormatA) < #VOGELS_NUMBER_FORMAT_CORRECT
    Error = VogelsNumberFormat_Error(GetVogelsNumberFormatStatus(*VogelsNumberFormatA), 0, *VogelsNumberFormatC)
  Else
    
    If b = 0
      VogelsNumberFormat_Zero(*VogelsNumberFormatC)
    Else
      
      If b < 0
        b = -b
        SetVogelsNumberFormatSign(*VogelsNumberFormatC, #VOGELS_NUMBER_FORMAT_NEGATIVE - GetVogelsNumberFormatSign(*VogelsNumberFormatA))
      Else
        SetVogelsNumberFormatSign(*VogelsNumberFormatC, GetVogelsNumberFormatSign(*VogelsNumberFormatA))
      EndIf
      
      ForEach GetVogelsNumberFormatNum(*VogelsNumberFormatA)
        m.q + GetVogelsNumberFormatNum(*VogelsNumberFormatA) * b
        AddVogelsNumberFormatNumElementEx(*VogelsNumberFormatC, m % #VOGELS_NUMBER_FORMAT_MOD)
        m / #VOGELS_NUMBER_FORMAT_MOD
      Next
      
      If m <> 0
        AddVogelsNumberFormatNumElementEx(*VogelsNumberFormatC, m)
      EndIf
      
    EndIf
    
  EndIf
  
  ProcedureReturn Error
EndProcedure

Procedure Private_VogelsNumberFormat_DiW(*VogelsNumberFormatA.VogelsNumberFormat, b.l, *VogelsNumberFormatC.VogelsNumberFormat)
  
  ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  ; We just make sure to start with a new fresh structure
  ; It's just in case someone use the same structured 
  ; variable multiple time. 
  
  ResetVogelsNumberFormat(*VogelsNumberFormatC)
  
  ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  
  Protected d.q, q.q
  
  If GetVogelsNumberFormatStatus(*VogelsNumberFormatA) < 0
    Error = VogelsNumberFormat_Error(GetVogelsNumberFormatStatus(*VogelsNumberFormatA), 0, *VogelsNumberFormatC)
  Else
    
    If b = 0
      SetVogelsNumberFormatStatus(*VogelsNumberFormatC, #VOGELS_NUMBER_FORMAT_UNDEFINED)
    Else
      
      If b < 0
        b = -b
        SetVogelsNumberFormatSign(*VogelsNumberFormatC, #VOGELS_NUMBER_FORMAT_NEGATIVE - GetVogelsNumberFormatSign(*VogelsNumberFormatA))
      Else
        SetVogelsNumberFormatSign(*VogelsNumberFormatC, GetVogelsNumberFormatSign(*VogelsNumberFormatA))
      EndIf
      
      LastVogelsNumberFormatNumElement(*VogelsNumberFormatA)
      
      Repeat 
        
        d = d * #VOGELS_NUMBER_FORMAT_MOD + GetVogelsNumberFormatNum(*VogelsNumberFormatA)
        q = d / b
        AddVogelsNumberFormatNumElementEx(*VogelsNumberFormatC, q)
        d - q * b
        
      Until PreviousVogelsNumberFormatNumElement(*VogelsNumberFormatA) = #Null
      
      VogelsNumberFormat_Normalize(*VogelsNumberFormatC)
      
    EndIf
    
  EndIf
  
  ProcedureReturn Error
EndProcedure

Procedure VogelsNumberFormat_Div(*VogelsNumberFormatA.VogelsNumberFormat, *VogelsNumberFormatB.VogelsNumberFormat, *VogelsNumberFormatC.VogelsNumberFormat)
  
  CopyVogelsNumberFormat(*VogelsNumberFormatA, VNF_Cache_A.VogelsNumberFormat)
  CopyVogelsNumberFormat(*VogelsNumberFormatB, VNF_Cache_B.VogelsNumberFormat)
  
  ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  ; We just make sure to start with a new fresh structure
  ; It's just in case someone use the same structured 
  ; variable multiple time. 
  
  ResetVogelsNumberFormat(*VogelsNumberFormatC)
  
  ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  
  If GetVogelsNumberFormatStatus(VNF_Cache_A) < #VOGELS_NUMBER_FORMAT_CORRECT Or GetVogelsNumberFormatStatus(VNF_Cache_B) < #VOGELS_NUMBER_FORMAT_CORRECT
    Error = VogelsNumberFormat_Error(GetVogelsNumberFormatStatus(VNF_Cache_A), GetVogelsNumberFormatStatus(VNF_Cache_B), *VogelsNumberFormatC)
  Else
    
    If ListVogelsNumberFormatNumSize(VNF_Cache_B) = 1
      FirstVogelsNumberFormatNumElement(VNF_Cache_B)
      If GetVogelsNumberFormatNum(VNF_Cache_B) = 0
        SetVogelsNumberFormatStatus(*VogelsNumberFormatC, #VOGELS_NUMBER_FORMAT_UNDEFINED)
      Else
        Private_VogelsNumberFormat_DiW(VNF_Cache_A, GetVogelsNumberFormatNum(VNF_Cache_B), *VogelsNumberFormatC)
        SetVogelsNumberFormatSign(*VogelsNumberFormatC, -(1 & (GetVogelsNumberFormatSign(VNF_Cache_A) + GetVogelsNumberFormatSign(VNF_Cache_B))))
      EndIf
      
    Else
      
      If VogelsNumberFormat_GreaterThan(VNF_Cache_B, VNF_Cache_A, #True)
        VogelsNumberFormat_Zero(*VogelsNumberFormatC)
      Else
        
        ; Hmmm...
        
      EndIf
      
    EndIf
    
  EndIf
  
  ProcedureReturn Error
EndProcedure

Procedure VogelsNumberFormat_Add(*VogelsNumberFormatA.VogelsNumberFormat, *VogelsNumberFormatB.VogelsNumberFormat, *VogelsNumberFormatC.VogelsNumberFormat)
  
  Protected s.q
  
  CopyVogelsNumberFormat(*VogelsNumberFormatA, VNF_Cache_A.VogelsNumberFormat)
  CopyVogelsNumberFormat(*VogelsNumberFormatB, VNF_Cache_B.VogelsNumberFormat)
  
  ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  ; We just make sure to start with a new fresh structure
  ; It's just in case someone use the same structured 
  ; variable multiple time. 
  
  ResetVogelsNumberFormat(*VogelsNumberFormatC)
  
  ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  
  If GetVogelsNumberFormatStatus(VNF_Cache_A) < #VOGELS_NUMBER_FORMAT_CORRECT Or GetVogelsNumberFormatStatus(VNF_Cache_A) < #VOGELS_NUMBER_FORMAT_CORRECT
    Error = VogelsNumberFormat_Error(GetVogelsNumberFormatStatus(VNF_Cache_A), GetVogelsNumberFormatStatus(VNF_Cache_B), *VogelsNumberFormatC)
  Else
    
    If GetVogelsNumberFormatSign(VNF_Cache_A) <> GetVogelsNumberFormatSign(VNF_Cache_B)
      SetVogelsNumberFormatSign(VNF_Cache_B, GetVogelsNumberFormatSign(VNF_Cache_A))
      VogelsNumberFormat_Sub(VNF_Cache_A, VNF_Cache_B, *VogelsNumberFormatC)
    Else
      
      SetVogelsNumberFormatSign(*VogelsNumberFormatC, GetVogelsNumberFormatSign(VNF_Cache_A))
      
      If ListVogelsNumberFormatNumSize(VNF_Cache_A) > ListVogelsNumberFormatNumSize(VNF_Cache_B)
        SwapVogelsNumberFormat(VNF_Cache_A, VNF_Cache_B)
      EndIf
      
      ForEach GetVogelsNumberFormatNum(VNF_Cache_A)
        
        s + GetVogelsNumberFormatNum(VNF_Cache_A)
        
        If ListVogelsNumberFormatNumIndex(VNF_Cache_A) <= ListVogelsNumberFormatNumSize(VNF_Cache_B)
          SelectVogelsNumberFormatNumElement(VNF_Cache_B, ListVogelsNumberFormatNumIndex(VNF_Cache_A))
          s + GetVogelsNumberFormatNum(VNF_Cache_B)
        EndIf
        
        AddVogelsNumberFormatNumElementEx(*VogelsNumberFormatC, s % #VOGELS_NUMBER_FORMAT_MOD)
        s / #VOGELS_NUMBER_FORMAT_MOD
        
      Next
      
      If s <> 0
        AddVogelsNumberFormatNumElementEx(*VogelsNumberFormatC, s)
      EndIf
      
      VogelsNumberFormat_Normalize(*VogelsNumberFormatC)
      
    EndIf
    
  EndIf
  
  ProcedureReturn Error
EndProcedure

Procedure VogelsNumberFormat_Sub(*VogelsNumberFormatA.VogelsNumberFormat, *VogelsNumberFormatB.VogelsNumberFormat, *VogelsNumberFormatC.VogelsNumberFormat)
  
  Protected s.q
  
  CopyVogelsNumberFormat(*VogelsNumberFormatA, VNF_Cache_A.VogelsNumberFormat)
  CopyVogelsNumberFormat(*VogelsNumberFormatB, VNF_Cache_B.VogelsNumberFormat)
  
  ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  ; We just make sure to start with a new fresh structure
  ; It's just in case someone use the same structured 
  ; variable multiple time. 
  
  ResetVogelsNumberFormat(*VogelsNumberFormatC)
  
  ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  
  If GetVogelsNumberFormatStatus(VNF_Cache_A) < #VOGELS_NUMBER_FORMAT_CORRECT Or GetVogelsNumberFormatStatus(VNF_Cache_A) < #VOGELS_NUMBER_FORMAT_CORRECT
    Error = VogelsNumberFormat_Error(GetVogelsNumberFormatStatus(VNF_Cache_A), GetVogelsNumberFormatStatus(VNF_Cache_B), *VogelsNumberFormatC)
  Else
    
    If GetVogelsNumberFormatSign(VNF_Cache_A) <> GetVogelsNumberFormatSign(VNF_Cache_B)
      
      SetVogelsNumberFormatSign(VNF_Cache_B, GetVogelsNumberFormatSign(VNF_Cache_A))
      VogelsNumberFormat_Add(VNF_Cache_A, VNF_Cache_B, *VogelsNumberFormatC)
    Else
      
      If VogelsNumberFormat_GreaterThan(VNF_Cache_A, VNF_Cache_B, #True)
        SetVogelsNumberFormatSign(*VogelsNumberFormatC, GetVogelsNumberFormatSign(VNF_Cache_A))
      Else
        SwapVogelsNumberFormat(VNF_Cache_A, VNF_Cache_B)
        SetVogelsNumberFormatSign(*VogelsNumberFormatC, #VOGELS_NUMBER_FORMAT_NEGATIVE - GetVogelsNumberFormatSign(VNF_Cache_A))
      EndIf
      
      ForEach GetVogelsNumberFormatNum(VNF_Cache_A)
        
        s + GetVogelsNumberFormatNum(VNF_Cache_A)
        
        If ListVogelsNumberFormatNumIndex(VNF_Cache_A) <= ListVogelsNumberFormatNumSize(VNF_Cache_B)
          SelectVogelsNumberFormatNumElement(VNF_Cache_B, ListVogelsNumberFormatNumIndex(VNF_Cache_A))
          s - GetVogelsNumberFormatNum(VNF_Cache_B)
        EndIf
        
        
        If s < 0
          AddVogelsNumberFormatNumElementEx(*VogelsNumberFormatC, s + #VOGELS_NUMBER_FORMAT_MOD)
          s = -1
        Else
          AddVogelsNumberFormatNumElementEx(*VogelsNumberFormatC, s)
          s = 0
        EndIf
        
      Next
      
      VogelsNumberFormat_Normalize(*VogelsNumberFormatC)
      
    EndIf
    
  EndIf
  
  ProcedureReturn Error
EndProcedure

Procedure VogelsNumberFormat_Square(*VogelsNumberFormatA.VogelsNumberFormat)
  
  If ListVogelsNumberFormatNumSize(*VogelsNumberFormatA) >= 0
    Error = VogelsNumberFormat_Mul(*VogelsNumberFormatA, *VogelsNumberFormatA, VNF_Cache_C.VogelsNumberFormat)
    VogelsNumberFormat_Copy(VNF_Cache_C, *VogelsNumberFormatA)
    ResetVogelsNumberFormat(VNF_Cache_C)
  EndIf  
  
  ProcedureReturn Error
EndProcedure

Procedure VogelsNumberFormat_Pow(*VogelsNumberFormatA.VogelsNumberFormat, Exponent.l, *VogelsNumberFormatC.VogelsNumberFormat)
  
  Protected z = 0, s, sign
  
  If Exponent < 0
    
    ; a^b | b<0 not implemented for now...
    VogelsNumberFormat_Error(#VOGELS_NUMBER_FORMAT_NOT_IMPLEMENTED, 0, *VogelsNumberFormatC)
    
  ElseIf ListVogelsNumberFormatNumSize(*VogelsNumberFormatA) >= 0
    
    VogelsNumberFormat_Copy(*VogelsNumberFormatA, VNF_Cache_A.VogelsNumberFormat)
    String_To_VogelsNumberFormat(VNF_Cache_B.VogelsNumberFormat, "1")
    
    If VogelsNumberFormat_Positive(*VogelsNumberFormatA) = #False
      VogelsNumberFormat_Abs(VNF_Cache_A)
      If Exponent & 1 
        SetVogelsNumberFormatSign(VNF_Cache_B, #VOGELS_NUMBER_FORMAT_NEGATIVE)
      EndIf
    EndIf
    
    While Exponent > 0
      
      s = 1 << z
      
      If Exponent & s
        VogelsNumberFormat_Mul(VNF_Cache_A, VNF_Cache_B, VNF_Cache_C.VogelsNumberFormat)
        VogelsNumberFormat_Copy(VNF_Cache_C, VNF_Cache_B)
        Exponent = Exponent - s
      EndIf
      
      If Exponent
        VogelsNumberFormat_Square(VNF_Cache_A)
        z = z + 1
      EndIf
      
    Wend
    
    VogelsNumberFormat_Copy(VNF_Cache_B, *VogelsNumberFormatC)
    
  EndIf
  
  ResetVogelsNumberFormat(VNF_Cache_A)
  ResetVogelsNumberFormat(VNF_Cache_B)
  ResetVogelsNumberFormat(VNF_Cache_C)
  
EndProcedure

Procedure VogelsNumberFormat_Factorial(Value.l, *VogelsNumberFormatC.VogelsNumberFormat)
  
  String_To_VogelsNumberFormat(VNF_Cache_B.VogelsNumberFormat, "1")
  
  For Index = 2 To Value
    String_To_VogelsNumberFormat(VNF_Cache_C.VogelsNumberFormat, Str(Index))
    VogelsNumberFormat_Mul(VNF_Cache_B, VNF_Cache_C, VNF_Cache_R.VogelsNumberFormat)
    VogelsNumberFormat_Copy(VNF_Cache_R, VNF_Cache_B)
  Next
  
  VogelsNumberFormat_Copy(VNF_Cache_B, *VogelsNumberFormatC)
  
  ResetVogelsNumberFormat(VNF_Cache_B)
  ResetVogelsNumberFormat(VNF_Cache_C)
  ResetVogelsNumberFormat(VNF_Cache_R)
  
EndProcedure

Procedure VogelsNumberFormat_Random(*VogelsNumberFormatA.VogelsNumberFormat, MaximumDigitCount.l)
  
  Max = Random(MaximumDigitCount)
  
  For Index = 0 To Max - 1
    RandomNumber.s = RandomNumber + Str(Random(9))
  Next
  
  String_To_VogelsNumberFormat(*VogelsNumberFormatA, RandomNumber)
  VogelsNumberFormat_Normalize(*VogelsNumberFormatA)
  
EndProcedure

Procedure ReadPreferenceVogelsNumberFormat(Keyword.s, *VogelsNumberFormatA.VogelsNumberFormat)
  
  String_To_VogelsNumberFormat(*VogelsNumberFormatA, ReadPreferenceString(Keyword, VogelsNumberFormat_To_String(*VogelsNumberFormatA)))
  
EndProcedure

Procedure WritePreferenceVogelsNumberFormat(Keyword.s, *VogelsNumberFormatA.VogelsNumberFormat)
  
  WritePreferenceString(Keyword, VogelsNumberFormat_To_String(*VogelsNumberFormatA))
  
EndProcedure

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 
; <<<<< !!! WARNING - YOU ARE NOW IN A TESTING ZONE - WARNING !!! <<<<< 
; <<<<< !!! WARNING - THIS CODE SHOULD BE COMMENTED - WARNING !!! <<<<< 
; <<<<< !!! WARNING - BEFORE THE FINAL COMPILATION. - WARNING !!! <<<<< 
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 

Debug "; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<"
Debug "; Test Normalize"
Debug ""

String_To_VogelsNumberFormat(MyNumber.VogelsNumberFormat, "000000000123456789987654321123456789987654321")
Debug VogelsNumberFormat_To_String(MyNumber)
VogelsNumberFormat_Normalize(MyNumber)
Debug VogelsNumberFormat_To_String(MyNumber)

Debug ""
Debug "; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<"
Debug "; Test Add"
Debug ""

String_To_VogelsNumberFormat(X.VogelsNumberFormat, "23 456")
String_To_VogelsNumberFormat(Y.VogelsNumberFormat, "98 765")
VogelsNumberFormat_Add(X, Y, Z.VogelsNumberFormat)
Debug VogelsNumberFormat_To_String(X, 3) + " + " + VogelsNumberFormat_To_String(Y, 3) + " = " + VogelsNumberFormat_To_String(Z, 3)

Debug ""
Debug "; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<"
Debug "; Test Substract"
Debug ""

VogelsNumberFormat_Sub(X, Y, MinusZ.VogelsNumberFormat)
Debug VogelsNumberFormat_To_String(X, 0) + " - " + VogelsNumberFormat_To_String(Y, 0) + " = " + VogelsNumberFormat_To_String(MinusZ, 0)

Debug ""
Debug "; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<"
Debug "; Test Multiplication"
Debug ""

String_To_VogelsNumberFormat(Number1.VogelsNumberFormat, "12345678999999994012121212155454789921999")
String_To_VogelsNumberFormat(Number2.VogelsNumberFormat, "15906045674")
VogelsNumberFormat_Mul(Number1, Number2, Number3.VogelsNumberFormat)
Debug VogelsNumberFormat_To_String(Number1) + " * " + VogelsNumberFormat_To_String(Number2) + " = " + VogelsNumberFormat_To_String(Number3)

Debug ""
Debug "; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<"
Debug "; Test Pow"
Debug ""

String_To_VogelsNumberFormat(Number.VogelsNumberFormat, "100")
VogelsNumberFormat_Pow(Number, 100, Result.VogelsNumberFormat)
Debug VogelsNumberFormat_To_String(Result)

Debug ""
Debug "; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<"
Debug "; Test Factorial"
Debug ""

For Factorial = 50 To 100
  VogelsNumberFormat_Factorial(Factorial, TestFactorial.VogelsNumberFormat)
  Debug Str(Factorial) + "! = " + VogelsNumberFormat_To_String(TestFactorial)
Next

Debug ""
Debug "; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<"
Debug "; Test Random number"
Debug ""

If CreateFile(0, "Test VogelsNumberFormat bin file.dat")
  
  For RandomID = 0 To 5
    VogelsNumberFormat_Random(TestRandom.VogelsNumberFormat, 25)
    Debug VogelsNumberFormat_To_String(TestRandom)
    WriteVogelsNumberFormat(0, TestRandom)
  Next
  
  CloseFile(0)
  
EndIf

Debug ""
Debug "; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<"
Debug "; Test Read/Write Binary file"
Debug ""

If ReadFile(0, "Test VogelsNumberFormat bin file.dat")
  
  For RandomID = 0 To 5
    ReadVogelsNumberFormat(0, TestReadBinFile.VogelsNumberFormat)
    Debug VogelsNumberFormat_To_String(TestReadBinFile)
    
  Next
  
  CloseFile(0)
  DeleteFile("Test VogelsNumberFormat bin file.dat")
  
EndIf

Debug ""
Debug "; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<"
Debug "; Test Read/Write Preferences"
Debug ""

If CreatePreferences("Test VogelsNumberFormat pref file.prefs")
  
  WritePreferenceVogelsNumberFormat("NumberX", X)
  WritePreferenceVogelsNumberFormat("NumberY", Y)
  WritePreferenceVogelsNumberFormat("NumberZ", Z)
  WritePreferenceVogelsNumberFormat("Factorial100", TestFactorial)
  ClosePreferences()
  
EndIf

If OpenPreferences("Test VogelsNumberFormat pref file.prefs")
  
  ReadPreferenceVogelsNumberFormat("NumberX", X2.VogelsNumberFormat)
  ReadPreferenceVogelsNumberFormat("NumberY", Y2.VogelsNumberFormat)
  ReadPreferenceVogelsNumberFormat("NumberZ", Z2.VogelsNumberFormat)
  ReadPreferenceVogelsNumberFormat("Factorial100", TestFactorial2.VogelsNumberFormat)
  ClosePreferences()
  
  DeleteFile("Test VogelsNumberFormat pref file.prefs")
  
EndIf

Debug VogelsNumberFormat_To_String(X)
Debug VogelsNumberFormat_To_String(X2)
Debug ""
Debug VogelsNumberFormat_To_String(Y)
Debug VogelsNumberFormat_To_String(Y2)
Debug ""
Debug VogelsNumberFormat_To_String(Z)
Debug VogelsNumberFormat_To_String(Z2)
Debug ""
Debug VogelsNumberFormat_To_String(TestFactorial)
Debug VogelsNumberFormat_To_String(TestFactorial2)

; <<<<<<<<<<<<<<<<<<<<<<<
; <<<<< END OF FILE <<<<<
; <<<<<<<<<<<<<<<<<<<<<<<
Dear Optimist, Pessimist,
and Realist,

While you guys were
busy arguing about the
glass of water, I DRANK IT !

Sincerely,
the Opportunist
jack
Addict
Addict
Posts: 1358
Joined: Fri Apr 25, 2003 11:10 pm

Re: Huge #'s

Post by jack »

works OK both on Windows 7-32 and Mac x64 :)
User avatar
Crusiatus Black
Enthusiast
Enthusiast
Posts: 389
Joined: Mon May 12, 2008 1:25 pm
Location: The Netherlands
Contact:

Re: Huge #'s

Post by Crusiatus Black »

Works on Windows 7 x64 using the x86 and x64 compilers, nice work!
Image
Bas Groothedde,
Imagine Programming

I live in a philosophical paradoxal randome filled with enigma's!
CalamityJames
User
User
Posts: 81
Joined: Sat Mar 13, 2010 4:50 pm

Re: Huge #'s

Post by CalamityJames »

Anyone looking at this thread will be interested in this one by davido ("Extended Integer Arithmetic code in PB") http://www.purebasic.fr/english/viewtop ... 27&t=52813

His routines, written in native PureBasic, include large number division and they are very fast.
User avatar
Michael Vogel
Addict
Addict
Posts: 2797
Joined: Thu Feb 09, 2006 11:27 pm
Contact:

Re: Huge #'s

Post by Michael Vogel »

CalamityJames wrote: His routines, written in native PureBasic, include large number division and they are very fast.
No differences in speed to the code here. But the division routine is indeed a nice bonus!
Post Reply