sorry deswegen, bin grad an einem GROßEN Projekt und hab ( glücklicherweisse ) lang keine Hilfe mehr gebraucht, doch jetzt brauch ich euern rat ...
Es geht um ein unteprojekt, unzwar hab ich eine xFP-Library geschrieben die ich hier gleich mal aushänge ( ist opensource ):
Code: Alles auswählen
; --[ xFP128lib ]--------------------------------------------------
; | eXtreme extended Floating Point - Library v0.01 Beta |
; | Written by Ronny Barthmann ( RONNIX ) |
; | used BigMathLib written by ______________ |
; -----------------------------------------------------------------
; Name: | Registers | Bits(F) | Bits(D) | Bits(?) | Multiplex
; -------+-----------+---------+---------+---------+-------------
; FP | A | 32 | 64 | 128 | 1x
; dFP | A*B | 64 | 128 | 256 | 2x
; eFP | A*B+C-D | 128 | 256 | 512 | 4x
; xFP | A*B+C-D-E | 160 | 320 | 640 | 5x
;
; FP = Floating Point
; dFP = Double Floating Point
; eFP = Extended Floating Point
; xFP = eXtreme Floating Point
; or eXtreme extended Floating Point
;
; FP = Floating Point
; dFP = Floating Point with Multiplex
; eFP = Floating Point with Multiplex and Difference ( + Trimming )
; xFP = Floating Point with Multiplex, Difference and Double Trimming
Structure FP64
base.d
EndStructure
Structure dFP64
base.d
multiplex.d
EndStructure
Structure eFP64
base.d
multiplex.d
admixture.d
subtraction.d
EndStructure
Structure xFP64
base.d
multiplex.d
admixture.d
subtraction.d
subtraction2.d
EndStructure
Structure FP32
base.f
EndStructure
Structure dFP32
base.f
multiplex.f
EndStructure
Structure eFP32
base.f
multiplex.f
admixture.f
subtraction.f
EndStructure
Structure xFP32
base.f
multiplex.f
admixture.f
subtraction.f
subtraction2.f
EndStructure
Procedure.s FromFP64(a.FP64)
s.s = _ToStrD(a.FP64\base.d)
ProcedureReturn s1.s
EndProcedure
Procedure.s FromdFP64(a.dFP64)
s1.s = _ToStrD(a.dFP64\base.d)
s2.s = _ToStrD(a.dFP64\multiplex.d)
s.s = _StrMul(s1.s,s2.s)
ProcedureReturn s.s
EndProcedure
Procedure.s FromeFP64(a.eFP64)
s1.s = _ToStrD(a.eFP64\base.d)
s2.s = _ToStrD(a.eFP64\multiplex.d)
s3.s = _ToStrD(a.eFP64\admixture.d)
s4.s = _ToStrD(a.eFP64\subtraction.d)
s.s = _StrMul(s1.s,s2.s)
s.s = _StrAdd(s.s,s3.s)
s.s = _StrSub(s.s,s4.s)
ProcedureReturn s.s
EndProcedure
Procedure.s FromxFP64(a.xFP64)
s1.s = _ToStrD(a.xFP64\base.d)
s2.s = _ToStrD(a.xFP64\multiplex.d)
s3.s = _ToStrD(a.xFP64\admixture.d)
s4.s = _ToStrD(a.xFP64\subtraction.d)
s5.s = _ToStrD(a.xFP64\subtraction2.d)
s.s = _StrMul(s1.s,s2.s)
s.s = _StrAdd(s.s,s3.s)
s.s = _StrSub(s.s,s4.s)
s.s = _StrSub(s.s,s5.s)
ProcedureReturn s.s
EndProcedure
Procedure.s FromFP32(a.FP32)
s.s = _ToStrF(a.FP32\base.f)
ProcedureReturn s1.s
EndProcedure
Procedure.s FromdFP32(a.dFP32)
s1.s = _ToStrF(a.dFP32\base.f)
s2.s = _ToStrF(a.dFP32\multiplex.f)
s.s = _StrMul(s1.s,s2.s)
ProcedureReturn s.s
EndProcedure
Procedure.s FromeFP32(a.eFP32)
s1.s = _ToStrF(a.eFP32\base.f)
s2.s = _ToStrF(a.eFP32\multiplex.f)
s3.s = _ToStrF(a.eFP32\admixture.f)
s4.s = _ToStrF(a.eFP32\subtraction.f)
s.s = _StrMul(s1.s,s2.s)
s.s = _StrAdd(s.s,s3.s)
s.s = _StrSub(s.s,s4.s)
ProcedureReturn s.s
EndProcedure
Procedure.s FromxFP32(a.xFP32)
s1.s = _ToStrF(a.xFP32\base.f)
s2.s = _ToStrF(a.xFP32\multiplex.f)
s3.s = _ToStrF(a.xFP32\admixture.f)
s4.s = _ToStrF(a.xFP32\subtraction.f)
s5.s = _ToStrF(a.xFP32\subtraction2.f)
s.s = _StrMul(s1.s,s2.s)
s.s = _StrAdd(s.s,s3.s)
s.s = _StrSub(s.s,s4.s)
s.s = _StrSub(s.s,s5.s)
ProcedureReturn s.s
EndProcedure
Procedure.FP64 ToFP64(s.s)
; Base
a.FP64\base.d = _FromStrF(s.s)
; Result
ProcedureReturn a.FP64
EndProcedure
Procedure.dFP64 TodFP64(s.s)
; Multiplex
If Left(s.s,1) = "-"
s2.s = "-"+_StrSqr(LTrim(s.s,"-"))
Else
s2.s = _StrSqr(s.s)
EndIf
a.dFP64\multiplex.d = _FromStrF(s2.s)
; Base
s1.s = _StrDiv(s.s,s2.s)
a.dFP64\base.d = _FromStrF(s1.s)
; Result
ProcedureReturn a.dFP64
EndProcedure
Procedure.eFP64 ToeFP64(s.s)
; Multiplex
If Left(s.s,1) = "-"
s2.s = "-"+_StrSqr(LTrim(s.s,"-"))
Else
s2.s = _StrSqr(s.s)
EndIf
a.eFP64\multiplex.d = _FromStrF(s2.s)
; Base
s1.s = _StrDiv(s.s,s2.s)
a.eFP64\base.d = _FromStrF(s1.s)
; Difference
s1.s = _ToStrF(a.eFP64\base.d)
s2.s = _ToStrF(a.eFP64\multiplex.d)
sTmp.s = _StrMul(s1.s,s2.s)
s3.s = _StrSub(s.s,sTmp)
a.eFP64\admixture.d = _FromStrF(s3.s)
; Trim
s3.s = _ToStrF(a.eFP64\admixture.d)
sTmp.s = _StrAdd(sTmp.s,s3.s)
s4.s = _StrSub(sTmp,s.s)
a.eFP64\subtraction.d = _FromStrF(s4.s)
; Result
ProcedureReturn a.eFP64
EndProcedure
Procedure.xFP64 ToxFP64(s.s)
; Multiplex
If Left(s.s,1) = "-"
s2.s = "-"+_StrSqr(LTrim(s.s,"-"))
Else
s2.s = _StrSqr(s.s)
EndIf
a.xFP64\multiplex.d = _FromStrF(s2.s)
; Base
s1.s = _StrDiv(s.s,s2.s)
a.xFP64\base.d = _FromStrF(s1.s)
; Difference
s1.s = _ToStrF(a.xFP64\base.d)
s2.s = _ToStrF(a.xFP64\multiplex.d)
sTmp.s = _StrMul(s1.s,s2.s)
s3.s = _StrSub(s.s,sTmp)
a.xFP64\admixture.d = _FromStrF(s3.s)
; Trim
s3.s = _ToStrF(a.xFP64\admixture.d)
sTmp.s = _StrAdd(sTmp.s,s3.s)
s4.s = _StrSub(sTmp,s.s)
a.xFP64\subtraction.d = _FromStrF(s4.s)
; Trim ( Pass 2 )
s4.s = _ToStrF(a.xFP64\subtraction.d)
sTmp.s = _StrSub(sTmp.s,s4.s)
s5.s = _StrSub(sTmp,s.s)
a.xFP64\subtraction2.d = _FromStrF(s5.s)
; Result
ProcedureReturn a.xFP64
EndProcedure
Procedure.FP32 ToFP32(s.s)
; Base
a.FP32\base.f = _FromStrF(s.s)
; Result
ProcedureReturn a.FP32
EndProcedure
Procedure.dFP32 TodFP32(s.s)
; Multiplex
If Left(s.s,1) = "-"
s2.s = "-"+_StrSqr(LTrim(s.s,"-"))
Else
s2.s = _StrSqr(s.s)
EndIf
a.dFP32\multiplex.f = _FromStrF(s2.s)
; Base
s1.s = _StrDiv(s.s,s2.s)
a.dFP32\base.f = _FromStrF(s1.s)
; Result
ProcedureReturn a.dFP32
EndProcedure
Procedure.eFP32 ToeFP32(s.s)
; Multiplex
If Left(s.s,1) = "-"
s2.s = "-"+_StrSqr(LTrim(s.s,"-"))
Else
s2.s = _StrSqr(s.s)
EndIf
a.eFP32\multiplex.f = _FromStrF(s2.s)
; Base
s1.s = _StrDiv(s.s,s2.s)
a.eFP32\base.f = _FromStrF(s1.s)
; Difference
s1.s = _ToStrF(a.eFP32\base.f)
s2.s = _ToStrF(a.eFP32\multiplex.f)
sTmp.s = _StrMul(s1.s,s2.s)
s3.s = _StrSub(s.s,sTmp)
a.eFP32\admixture.f = _FromStrF(s3.s)
; Trim
s3.s = _ToStrF(a.eFP32\admixture.f)
sTmp.s = _StrAdd(sTmp.s,s3.s)
s4.s = _StrSub(sTmp,s.s)
a.eFP32\subtraction.f = _FromStrF(s4.s)
; Result
ProcedureReturn a.eFP32
EndProcedure
Procedure.xFP32 ToxFP32(s.s)
; Multiplex
If Left(s.s,1) = "-"
s2.s = "-"+_StrSqr(LTrim(s.s,"-"))
Else
s2.s = _StrSqr(s.s)
EndIf
a.xFP32\multiplex.f = _FromStrF(s2.s)
; Base
s1.s = _StrDiv(s.s,s2.s)
a.xFP32\base.f = _FromStrF(s1.s)
; Difference
s1.s = _ToStrF(a.xFP32\base.f)
s2.s = _ToStrF(a.xFP32\multiplex.f)
sTmp.s = _StrMul(s1.s,s2.s)
s3.s = _StrSub(s.s,sTmp)
a.xFP32\admixture.f = _FromStrF(s3.s)
; Trim
s3.s = _ToStrF(a.xFP32\admixture.f)
sTmp.s = _StrAdd(sTmp.s,s3.s)
s4.s = _StrSub(sTmp,s.s)
a.xFP32\subtraction.f = _FromStrF(s4.s)
; Trim ( Pass 2 )
s4.s = _ToStrF(a.xFP32\subtraction.f)
sTmp.s = _StrSub(sTmp.s,s4.s)
s5.s = _StrSub(sTmp,s.s)
a.xFP32\subtraction2.f = _FromStrF(s5.s)
; Result
ProcedureReturn a.xFP32
EndProcedure
1. ist das Gut !?
2.a. kennt ihr eine Library die sich mit OpenSource ( GPL v2 oder höher ) versteht ( damit ich sie einbinden kann ) die mit großen Zahlen ( als String ) effizient rechnen kann ( MUSS nicht schnell sein, währ aber schön ) sie sollte folgende Befehle unterstützen ( inklammern die Platzhalter vom obigen Code:
Code: Alles auswählen
Float/Double -> String ( _ToStrF() / _ToStrD() )
String -> Float/Double ( _FromStrF() / _FromStrD() )
Add String with String ( _AddStr() )
Sub String from String ( _SubStr() )
Div String by String ( _DivStr() )
Mul String with String ( _MulStr() )
Return square-root from String as String ( _SqrStr() )
4. Hab ich flüchtigkeits fehler gemacht ( ACHTUNG: Begutachtung setzt voraus das ihr den sinn hinter dem ganzen bullshit seht und das gute in ihm sieht Muhahaha )
ich bin auf jeden fall für Feedback SEHR dankbar ( ihr wisst schon, so mit Herzschen und Blümchen und "Hach ist das gut" )
P.S.: Im header steht etwas von "Bits(?)", bitte nicht wundern, ich hab den header schon für 128bit ausgelegt, die ja aber von PureBasic nicht unterstützt werden, wenn es irgendwann mal unterstützt wird, folgen natürlich Funktionen wie "ToxFP128()" u.s.w.