hier mal ein Auszug aus meinem Mathe-Include, von dem ich denke das ihr es auch gebrauchen könnt:
Wissenschaftliches Runden und Wissenschaftliche Schreibweise
Code: Alles auswählen
; Wissenschafliches Runden
Procedure.d RoundSci(Value.d, Precision=1)
If Value = 0
ProcedureReturn Value
Else
Protected Log10.d = Log10(Abs(Value)) - Precision + 1
Protected Exponent = Round(Log10, #PB_Round_Down)
ProcedureReturn Round(Value*Pow(10, -Exponent), #PB_Round_Nearest) * Pow(10, Exponent)
EndIf
EndProcedure
; Wissenschafliche Schreibweise
Procedure.s StrSci(Value.d, NbDecimals=-1, Prefix$="e")
Protected String$, Exponent
If Value = 0
Exponent = 0
Else
Protected Log10.d = Log10(Abs(Value))
Exponent = Round(Log10, #PB_Round_Down)
EndIf
Value * Pow(10, -Exponent)
Prefix$ + Str(Exponent)
If NbDecimals = -1
String$ = StrD(Value)
Else
String$ = StrD(Value, NbDecimals)
EndIf
If FindString(String$, ".", 1)
String$ = RTrim(String$, "0")
String$ = RTrim(String$, ".")
EndIf
ProcedureReturn String$+Prefix$
EndProcedure
Procedure.d ValSci(String$, Prefix$="e")
If Prefix$ = "e"
ProcedureReturn ValD(String$)
Else
Protected Position = FindString(String$, Prefix$, 1)
If Position
ProcedureReturn ValD(Left(String$,Position-1)) * Pow(10, Val(Mid(String$,Position+Len(Prefix$))))
Else
ProcedureReturn ValD(String$)
EndIf
EndIf
EndProcedure
Code: Alles auswählen
For n = 0 To 3
Debug "234.567 mit Genauigkeit "+Str(n)+" ist : "+StrD(RoundSci(234.567, n))
Next
Debug "---"
For n = 0 To 3
Debug "765.432 mit Genauigkeit "+Str(n)+" ist : "+StrD(RoundSci(765.432, n))
Next
Debug "---"
For n = -10 To 10 Step 5
Debug StrD(#PI*Pow(10,n))+" ist wissenschaftlich : "+StrSci(#PI*Pow(10,n))
Next
Debug "---"
Debug "Andere Schreibweisen für : "+StrD(#PI*1e5)
Debug StrSci(#PI*1e5, 0)
Debug StrSci(#PI*1e5, 3)
Debug StrSci(#PI*1e5, 6)
Debug StrSci(#PI*1e5, 1, "*10^")
Debug "---"
Debug ValSci("2.5e5")
Debug ValSci("2.5*10^5", "*10^")
Rechnen mit Winkeln234.567 mit Genauigkeit 0 ist : 0.0000000000
234.567 mit Genauigkeit 1 ist : 200.0000000000
234.567 mit Genauigkeit 2 ist : 230.0000000000
234.567 mit Genauigkeit 3 ist : 235.0000000000
---
765.432 mit Genauigkeit 0 ist : 1000.0000000000
765.432 mit Genauigkeit 1 ist : 800.0000000000
765.432 mit Genauigkeit 2 ist : 770.0000000000
765.432 mit Genauigkeit 3 ist : 765.0000000000
---
0.0000000003 ist wissenschaftlich : 3.1415926536e-10
0.0000314159 ist wissenschaftlich : 3.1415926536e-5
3.1415926536 ist wissenschaftlich : 3.1415926536e0
314159.2653589793 ist wissenschaftlich : 3.1415926536e5
31415926535.8979300000 ist wissenschaftlich : 3.1415926536e10
---
Andere Schreibweisen für : 314159.2653589793
3e5
3.142e5
3.141593e5
3.1*10^5
---
250000.0
250000.0
Code: Alles auswählen
; Modulo für Fließkommazahlen
Macro ModF(Value, Factor)
( (Value) - Int((Value)/(Factor))*(Factor) )
EndMacro
#AngleUnit_Rad = 2*#PI
#AngleUnit_Dec = 360
#AngleUnit_Grad = 400
; Umrechnen der Winkelmaße
Macro ConvertAngle(Angle, UnitIn, UnitOut)
( (Angle) * (UnitOut) / (UnitIn) )
EndMacro
; Korregiert einen Winkel in das standard Intervall
Procedure.f RealAngle(Angle.f, Unit.f=#AngleUnit_Rad)
If Angle < 0
ProcedureReturn ModF(Angle, Unit) + Unit
Else
ProcedureReturn ModF(Angle, Unit)
EndIf
EndProcedure
; Gibt den Winkelunterschied zurück
Procedure.f AngleDifference(Angle1.f, Angle2.f, Unit.f=#AngleUnit_Rad)
Protected Difference.f
Angle1 = RealAngle(Angle1, Unit)
Angle2 = RealAngle(Angle2, Unit)
Difference = Angle2 - Angle1
If Difference > Unit/2
Difference - Unit
ElseIf Difference < -Unit/2
Difference + Unit
EndIf
ProcedureReturn Difference
EndProcedure
Code: Alles auswählen
Debug ConvertAngle(#PI, #AngleUnit_Rad, #AngleUnit_Dec) ; Ergibt 180.0
Debug ConvertAngle(90, #AngleUnit_Dec, #AngleUnit_Grad) ; Ergibt 100
Debug "---"
Debug RealAngle(-90, #AngleUnit_Dec) ; Ergibt 270.0
Debug RealAngle(-400, #AngleUnit_Dec) ; Ergibt 320.0
Debug RealAngle(400, #AngleUnit_Dec) ; Ergibt 40.0
Debug RealAngle(5*#PI) ; Ergibt #PI
Debug "---"
Debug AngleDifference(20, 40, #AngleUnit_Dec) ; Ergibt 20
Debug AngleDifference(180, 90, #AngleUnit_Dec) ; Ergibt -90
Debug AngleDifference(359, 1, #AngleUnit_Dec) ; Ergibt 2
Debug AngleDifference(80, 280, #AngleUnit_Dec) ; Ergibt -160
Das ist nützlich wenn sich ein "Objekt" zu einem Ziel drehen soll, damit es die kürzeste Drehung macht