per RegExReplace Hexadezimalpunkte ersetzen

Post a reply


In an effort to prevent automatic submissions, we require that you complete the following challenge.
Smilies
:D :) ;) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :!: :?: :idea: :| :mrgreen: :geek: :ugeek: :arrow: :angel: :clap: :crazy: :eh: :lolno: :problem: :shh: :shifty: :sick: :silent: :think: :thumbup: :thumbdown: :salute: :wave: :wtf: :yawn: :facepalm: :bravo: :dance: :beard: :morebeard: :xmas: :HeHe: :trollface: :cookie: :rainbow: :monkeysee: :monkeysay: :happybday: :headwall: :offtopic: :superhappy: :terms: :beer:
View more smilies

BBCode is ON
[img] is OFF
[flash] is OFF
[url] is ON
Smilies are ON

Topic review
   

Expand view Topic review: per RegExReplace Hexadezimalpunkte ersetzen

Re: per RegExReplace Hexadezimalpunkte ersetzen

Post by Rohwedder » 02 Jul 2019, 02:16

Hallo,
ich habe es nun mit einem länglichen Zweizeiler gelöst. Bin aber noch auf der Suche nach einer eleganteren Methode.

Code: Select all

q::
Exp := "2 * 0x3.243F6A8885A" ;Rechenaufgabe
While, RegExMatch(Exp, "(0x[[:xdigit:]]*\.)([[:xdigit:]]*)", M)
	Exp := StrReplace(Exp,M,"(" StrReplace(M,".") "/0x1" RegexReplace(M2,".","0") ")")
MsgBox,% "2 * Pi ≈ " Eval(Exp)
Return
eval(exp) ;tidbit: https://www.autohotkey.com/boards/viewtopic.php?f=6&t=15389
{ ;(gekürzt!) Uses Javascript/COM to evaluate stringed math expressions.
    obj:=ComObjCreate("HTMLfile")
    obj.write("<body><script>document.body.innerText=eval('" exp "');</script>")
    return inStr(cabbage:=obj.body.innerText, "body") ? "ERROR" : cabbage
}

Re: per RegExReplace Hexadezimalpunkte ersetzen

Post by Rohwedder » 01 Jul 2019, 09:27

Verboten? Das meinen vielleicht Programmierer! Aber, deren Mathematik ist nur etwas höher als die der Kaufleute welche keine negativen Zahlen kennen und stattdessen von Soll und Haben reden.
Autohotkeys Format() kennt immerhin die Typenzeichen a und A: Vorzeichenfähiger hexadezimaler Floating-Point-Wert mit doppelter Genauigkeit im Format [?]0xh.hhhh p±dd. Hierbei repräsentiert h.hhhh die Hexadezimalstellen (kleingeschrieben) der Mantisse und dd eine oder mehrere Stellen des Exponenten.
Welcher praktische Hintergrund?
Machte bei https://www.autohotkey.com/boards/viewtopic.php?p=279817#p279817 mit.
Dort wollte vsub einen Rechner welcher das Ergebnis in hex und dez präsentiert.
Ich hatte die hexadezimale Ausgabezeile beigesteuert, natürlich mit richtigen rationalen Hexzahlen, d.h. nicht dieser [?]0xh.hhhh p±dd-Quatsch. Vollständigkeitshalber wollte ich nun die Eingabezeile ebenfalls tauglich für Floating-Point-Hexzahlen machen.
In meinen Haupt-Skript verwende ich übrigens Floating-Point-Hex-Farbwerte zur Beschreibung der Durchschnittsfarben von Flächen.

Re: per RegExReplace Hexadezimalpunkte ersetzen

Post by just me » 01 Jul 2019, 06:51

Moin Rohwedder,

durch Deine Frage habe ich schon mal gelernt, dass es erlaubt ist, innerhalb der hexadezimalen Darstellung einen "Hexadezimalpunkt" zu verwenden. Welcher praktische Hintergrund führt dich zu dieser Frage?

per RegExReplace Hexadezimalpunkte ersetzen

Post by Rohwedder » 01 Jul 2019, 05:14

Hallo,
Javascript/COM (wie auch Autohotkey) versteht offenbar keine rationalen Zahlen mit Hexadezimalpunkt.
Deswegen wird in dieser Rechenaufgabe:

Code: Select all

q::
Exp := "2 * 0x3.243F6A8885A" ;Rechenaufgabe
; bitte dieses RegexReplace verallgemeinern:
Exp := RegexReplace(Exp,"0x3.243F6A8885A","(0x3243F6A8885A/0x100000000000)")
; die Anzahl der "0" in 0x100000000000 hinter "0x" ist gleich der Anzahl
; der Nach-Hexadezimalpunkt-Stellen von 0x3.243F6A8885A
MsgBox,% "2 * Pi ≈ " Eval(Exp)
Return
eval(exp) ;tidbit: https://www.autohotkey.com/boards/viewtopic.php?f=6&t=15389
{ ;(gekürzt!) Uses Javascript/COM to evaluate stringed math expressions.
    obj:=ComObjCreate("HTMLfile")
    obj.write("<body><script>document.body.innerText=eval('" exp "');</script>")
    return inStr(cabbage:=obj.body.innerText, "body") ? "ERROR" : cabbage
}
das hexadezimale Pi ≈ 0x3.243F6A8885A vorab per Primitiv-RegexReplace in einen Quotienten aus ganzen Hexzahlen umgewandelt.
Mein Ziel ist es das Primitiv-RegexReplace durch ein allgemeines zu ersetzen.
Die Position des Punktes sollte doch irgendwie mit dem Metazeichen \G erfassbar sein und zur Generierung des 0xFF... -Divisor verwendet werden können?
Edit: Da war leider ein Fehler drin!

Top