
Huge #'s
- electrochrisso
- Addict
- Posts: 989
- Joined: Mon May 14, 2007 2:13 am
- Location: Darling River
Re: Huge #'s
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
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
and Realist,
While you guys were
busy arguing about the
glass of water, I DRANK IT !
Sincerely,
the Opportunist
Re: Huge #'s
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
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
and Realist,
While you guys were
busy arguing about the
glass of water, I DRANK IT !
Sincerely,
the Opportunist
Re: Huge #'s
works OK both on Windows 7-32 and Mac x64 

- Crusiatus Black
- Enthusiast
- Posts: 389
- Joined: Mon May 12, 2008 1:25 pm
- Location: The Netherlands
- Contact:
Re: Huge #'s
Works on Windows 7 x64 using the x86 and x64 compilers, nice work!
-
- User
- Posts: 81
- Joined: Sat Mar 13, 2010 4:50 pm
Re: Huge #'s
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.
His routines, written in native PureBasic, include large number division and they are very fast.
- Michael Vogel
- Addict
- Posts: 2797
- Joined: Thu Feb 09, 2006 11:27 pm
- Contact:
Re: Huge #'s
No differences in speed to the code here. But the division routine is indeed a nice bonus!CalamityJames wrote: His routines, written in native PureBasic, include large number division and they are very fast.