Seite 1 von 1

Ein paar Prozeduren für Mathe (Winkel & wissens. Schreibw.)

Verfasst: 22.11.2009 19:43
von STARGÅTE
Tachchen,

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
Beispiel:

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^")
234.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
Rechnen mit Winkeln

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
Beispiel:

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
AngleDifference gibt mir also den (kleinsten) Wert (mit Vorzeichen) zurück den ich dazunehmen muss, damit von von Angle1 zu Angle2 kommt.
Das ist nützlich wenn sich ein "Objekt" zu einem Ziel drehen soll, damit es die kürzeste Drehung macht