Fischer-Bayern.de
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen   RegistrierenRegistrieren 
 ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Betrag einer Zahl - Vermisse Abs()

 
Neues Thema eröffnen   Neue Antwort erstellen    Fischer-Bayern.de Foren-Übersicht -> AppleScript X
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Seppel
•-->
•-->


Anmeldedatum: 22.09.2005
Beiträge: 59
Wohnort: Wiesbaden

BeitragVerfasst am: 10.09.2009 - 10:17    Titel: Betrag einer Zahl - Vermisse Abs() Antworten mit Zitat

Hallo Ihr Lieben,

hat wer einen Tip für mich, wo ich sowas finde?

Ich will einfach den Betrag einer Zahl ermitteln, schlicht das Vorzeichen weglassen.

Natürlich kann man * -1 nehmen, setzt aber wieder ein If voraus.

Das muss doch einfacher gehen.

Liebe Grüße
Seppel
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Wolle-77
•--->
•--->


Anmeldedatum: 25.02.2003
Beiträge: 447
Wohnort: Geldern

BeitragVerfasst am: 10.09.2009 - 13:20    Titel: Antworten mit Zitat

Hallo Seppel,

ich glaube, es spricht nichts dagegen, daß mit if-else in AppleScript direkt zu machen. Ich habe mal ein paar Versuche angestellt:

(Die Zahlenreihe ist immer -17, 3, 0, 3, 17 und die Anzahl der Durchläufe ist 100.000 Mal; also immer 500.000 Berechnungen)

Methode 1:

Code:
repeat 100000 times -- Methode 1
   set zahlen to {-17, -3, 0, 3, 17}
   set werte to {}
   repeat with i in zahlen
      if i is less than 0 then
         set end of werte to i * -1
      else
         set end of werte to i as integer
      end if
   end repeat
end repeat
return werte


Hier ist das if-else eingesetzt und er schaut, ob die Zahl unter 0 ist. Ansonsten wird der Wert direkt eingesetzt. Der Typ bleibt die ganze Zeit integer.

Methode 2:

Code:
repeat 100000 times -- Methode 2
   set zahlen to {-17, -3, 0, 3, 17}
   set werte to {}
   repeat with i in zahlen
      if i is less than 0 then
         set end of werte to (text 2 thru -1 of (i as string)) as integer
      else
         set end of werte to i as integer
      end if
   end repeat
end repeat
return werte


Hier wird im Falle, daß die Zahl negativ ist, der Weg über den zweiten bis zum letzten Zeichen der Zahl als String gegangen. Das war ein Denkansatz, braucht aber schon ein wenig länger und ist daher glaube ich nicht zu empfehlen.

Methode 3:

Code:
repeat 100000 times -- Methode 3
   set zahlen to {-17, -3, 0, 3, 17}
   set werte to {}
   repeat with i in zahlen
      if i is less than 0 then set end of werte to (text 2 thru -1 of (i as string)) as integer
      if i is greater than or equal to 0 then set end of werte to i as integer
   end repeat
end repeat
return werte


Das ist im Prinzip die Gleiche wie Methode 2, allerdings wird nicht mit if-else, sondern zweimal mit if gearbeitet. Im Code sieht das kürzer aus, in der Laufzeit wird das jedoch länger; also ist das zu vermeiden.

Methode 4:

Code:
repeat 100000 times -- Methode 4
   set zahlen to {-17, -3, 0, 3, 17}
   set werte to {}
   ignoring hyphens
      repeat with i in zahlen
         set end of werte to (i as string) as integer
      end repeat
   end ignoring
end repeat
return werte


Woran ich bei 2 und 3 übrigens gedacht habe, ist hier bei Methode 4 – die leider nicht funktioniert – zu sehen: Wenn man hyphens ignoriert (also "-"), dann würde das nicht in den String übernommen. Aber ignoring-Anweisungen sind nur für Vergleiche, nicht als Anweisungen für Typkonvertionen.

Methode 5:

Code:
repeat 100000 times -- Methode 5
   do shell script "bc -l <<< 'define abs(x) { if ( x<0 ) return -x; return x } ; abs(-17) ; abs(-3) ; abs(0) ; abs(3) ; abs(17)'"
end repeat


Natürlich kann man auch über die Shell gehen. Hier wird in bc Deine abs-Funktion definiert und die 5 Zahlen direkt mitgegeben – und das dann aus AppleScript heraus aufgerufen. Ein wenig umständlich; jedoch hilfreich, wenn es sich um wenige Werte handelt (die man zur Laufzeit zusammensetzen könnte). Jedoch in dieser Kupplungsschleife ist das undiskutabel, es braucht bisher deutlich am längsten.

Methode 6:

Code:
do shell script "for i in -17 -3 0 3 17 ; do bc -l <<< 'define abs(x) { if ( x<0 ) return -x; return x } ; abs(i)' ; done" -- Methode 6


Das funktioniert aus irgendeinem Grund nicht; keine Ahnung warum. Es kommt 5 mal 0 heraus, auch wenn man innerhalb von abs() $i angibt, was eigentlich eine Variable in der Shell darstellt.


Von daher: Es ist zwar interessant, mit bc zu arbeiten und in Einzelfällen sicherlich hilfreich (besonders wenn es um etwas komplizierteres wie cos() oder sin() oder so geht oder Du pi auf tausende Stellen ausrechnen möchtest), aber in dem Fall geht das mit AppleScript selbst am schnellsten.
_________________
Martin Wolter
--
Apple rocks the planet!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Seppel
•-->
•-->


Anmeldedatum: 22.09.2005
Beiträge: 59
Wohnort: Wiesbaden

BeitragVerfasst am: 11.09.2009 - 12:56    Titel: Antworten mit Zitat

Danke Wolle Smile

Wolle-77 hat Folgendes geschrieben:


ich glaube, es spricht nichts dagegen, daß mit if-else in AppleScript direkt zu machen.


Ich hatte befürchtet, dass Du das sagst.

Code:
if _x1 < 0 then set _x1 to _x1 * -1


war vorher meine Wahl, weil ich sonst keine andere Möglichkeit sah.

Nun möchte ich grundsätzlich alles in AS machen, ohne etwa die Shell zu nutzen. Es hatte sich bisher bei mir bewährt, gerade weil meine Scripte auf unterschiedlichen OS laufen. Da möchte ich mögliche Fehlerquellen minimieren.

Nochmals herzlichen Dank für Deine stete Hilfe

Lieben Gruß

Seppel
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Wolle-77
•--->
•--->


Anmeldedatum: 25.02.2003
Beiträge: 447
Wohnort: Geldern

BeitragVerfasst am: 28.09.2009 - 23:48    Titel: Antworten mit Zitat

Als Nachtrag nun die funktionierende Methode 6, aufgebohrt als Methode 7:

Code:
do shell script "for j in {1..1000} ; do for i in -17 -3 0 3 17 ; do bc -l <<< 'define abs(x) { if ( x<0 ) return -x; return x } ; abs('$i')' ; done ; done"

_________________
Martin Wolter
--
Apple rocks the planet!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Skeeve
•---->
•---->


Anmeldedatum: 20.04.2006
Beiträge: 1068

BeitragVerfasst am: 03.10.2009 - 00:08    Titel: Antworten mit Zitat

Ohne if:
Code:

abs (-42)
to abs (_x)
   return sqrt (_x * _x)
end abs

Edit: Das scheint nur bei mir und nur zufällig zu klappen. Siehe weiter unten.
_________________
"All problems are solved in slightly less than half an hour" (Chumbawamba, "Hey Hey We're The Junkies")


Zuletzt bearbeitet von Skeeve am 03.10.2009 - 08:51, insgesamt 2-mal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Wolle-77
•--->
•--->


Anmeldedatum: 25.02.2003
Beiträge: 447
Wohnort: Geldern

BeitragVerfasst am: 03.10.2009 - 00:22    Titel: Antworten mit Zitat

Skeeve, keine Ahnung, warum die Schlüsselwörter blau werden, aber das läuft bei mir gar nicht. Du hast nicht zufällig eine OSAX drauf, die Dir diese Befehle bereit stellt?

Ich bekomme das nicht ans Laufen.
_________________
Martin Wolter
--
Apple rocks the planet!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Skeeve
•---->
•---->


Anmeldedatum: 20.04.2006
Beiträge: 1068

BeitragVerfasst am: 03.10.2009 - 08:40    Titel: Antworten mit Zitat

Ich weiß zwar gerade nicht, was Du mir erzählen willst, aber ich muß folgendes feststellen:

  1. Es gibt die Funktion abs
  2. Ich verwende keinerlei OSAX außer dem, was als Standard da ist, jedenfalls nicht bewußt


Nachtrag: Ein wenig googel hat mir gezeigt: Ich scheine doch mir irgendwas eingefangen zu haben, das mir abs und sqrt zur Verfügung stellt. Hier also eine Version die ohne diese Funktionen auskommt:

Code:
xabs(-42)
to xabs(_x)
   return (_x ^ 2) ^ 0.5
end xabs


Nachtrag 2: Ich wußte, es war eine dumme Idee "Smile" zu installieren. Die haben mir das Zeug untergeschoben.
_________________
"All problems are solved in slightly less than half an hour" (Chumbawamba, "Hey Hey We're The Junkies")
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Fischer-Bayern.de Foren-Übersicht -> AppleScript X Alle Zeiten sind GMT + 2 Stunden
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.


Powered by phpBB © 2001, 2002 phpBB Group
Deutsche Übersetzung von phpBB.de


AppleScript für absolute Starter