Fragestellung zu Verzweigungsabfrage

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Cion
User
Beiträge: 2
Registriert: Donnerstag 31. Oktober 2013, 18:31

Hey liebes Forum,

ich habe eine bitte an euch, da ich mit meinem Programm nicht voran komme.
Ich habe ein Problem mit einer if-Abfrage und mein Programm gibt mir einen String einer länge aus den er mir nicht ausgeben sollte.

Code: Alles auswählen

number = float(input())
controle2 = True
...
...
...
ganzzahl = int(number)
decimal_number = number - ganzzahl
nachkomma_zahl = ''
positive_zahl = ''

while controle2 == True:
	if decimal_number * 2 >= 1 and (len(positive_zahl) + len(nachkomma_zahl)) < 24:
		decimal_number = decimal_number * 2 - 1
		nachkomma_zahl += '1'
	elif decimal_number * 2 < 1 and (len(positive_zahl) + len(nachkomma_zahl)) < 24:
		decimal_number = decimal_number * 2
		nachkomma_zahl += '0'
	else:
		controle2 = False
		print(nachkomma_zahl)
Was ich damit eigentlich erreichen will, ist die Darstellung einer Dezimalzahl im IEEE-754 Format. Das Problem hierbei ist nun, dass ich bei Eingabe etwas höherer Zahlen, z.Bsp. 9872313456 einen String ausgegeben bekomme, der die 24 Zeichen Grenze, die ich gesetzt habe überschreitet.
Ich bitte um Unterstützung :)
zikzak
User
Beiträge: 21
Registriert: Sonntag 22. September 2013, 07:28
Wohnort: Sipbachzell, Österreich

Servus Cion,

ich bin zwar bei Gott kein Python-Profi, ich "erahne" aber ein eher grundsätzliches Problem, dass Du am Besten
detaillierter erläutern solltest.

Was willst Du genau ? Schaffe eine Schnittstelle (input, output) und beschreibe den Sachverhalt/Aufgabenstellung.

HG Alex
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

@Cion: Deine Beispielzahl hat keine Nachkommastellen. Das Ergebnis ist deshalb bei mir '000000000000000000000000', was exakt 24 Nullen sind.
BlackJack

@Cion: Quelltext den man nicht ausführen kann muss man im Kopf nachvollziehen. Das ist vielleicht ein wenig zu viel verlangt bei solchen Fragestellungen. Vor allem sehe ich da jetzt nicht auf Anhieb was Du meinst, denn bei einer grossen Zahl wie 9872313456 sehe ich überhaupt nicht wie die Schleife dort *überhaupt* relevant ist, denn die geht ja anscheinend nur durch den Nachkommaanteil und der ist bei 9872313456 gar nicht vorhanden. Da dürften soweit ich das sehe nur 24 Nullen bei heraus kommen für `nachkomma_zahl`. Oder ist Dein Problem das es 24 sind und nicht 23 wie man das bei IEEE 754 für die Mantisse einer 32-Bit-Darstellung erwarten würde‽

Soll das möglichst einfach passieren oder möchtest Du das umständlich ausdrücken? Einfach wäre das `ctypes`-Modul und da dann von einem Array mit einem Float in einen Pointer auf ein uint32 casten. Da lassen sich dann ganz einfach mit Bitschieben und -maskieren Vorzeichen, Exponent, und Mantisse isolieren und mit Zeichenkettenformatierung als Binärzahlen ausgeben.
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

floats haben in Python 56bit plus die 1 vor dem Komma. Die kann man natürlich kürzen:

Code: Alles auswählen

import re
number = float(raw_input())
print re.sub('\.([0-9a-f]+)',lambda m: '.'+bin(int(m.group(1),16))[2:26],number.hex())[2:]
Cion
User
Beiträge: 2
Registriert: Donnerstag 31. Oktober 2013, 18:31

Tut mir Leid das ich das nicht besser formuliert habe, aber danke BlacJack, dein Beitrag hat mir geholfen, hab das Problem jetzt gelöst :)

EDIT: Übrigens eine andere Frage, kann man eigentlich einen Float problemlos in einen Int konvertieren oder funktioniert das nur andersrum fehlerfrei ?
BlackJack

@Cion: Bei der Frage fehlt was Du unter Float und Int verstehst. Die Python-Datentypen `float` und `int`? Und was ist „fehlerfrei”? Das funktioniert bei den Python-Datentypen weder in die eine, noch in die andere Richtung. Die Grösse vom `int`-Typ ist nur duch den verfügbaren Hauptspeicher beschränkt, bei `float` gibt es Grenzen die in `sys.float_info` abgefragt werden können. Und es gibt `float`-Werte die nicht in `int` umgewandelt werden können, nicht einmal verlustbehaftet (Nachkommastellen die wegfallen) sondern gar nicht:

Code: Alles auswählen

In [136]: sys.float_info.max_10_exp
Out[136]: 308

In [137]: float(10**sys.float_info.max_10_exp)
Out[137]: 1e+308

In [138]: float(10**(sys.float_info.max_10_exp + 1))
---------------------------------------------------------------------------
OverflowError                             Traceback (most recent call last)
/home/bj/<ipython-input-138-8bf06174ae73> in <module>()
----> 1 float(10**(sys.float_info.max_10_exp + 1))

OverflowError: long int too large to convert to float

In [139]: float('nan')
Out[139]: nan

In [140]: int(float('nan'))
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
/home/bj/<ipython-input-140-3c09bc107dae> in <module>()
----> 1 int(float('nan'))

ValueError: cannot convert float NaN to integer

In [141]: float('inf')
Out[141]: inf

In [142]: int(float('inf'))
---------------------------------------------------------------------------
OverflowError                             Traceback (most recent call last)
/home/bj/<ipython-input-142-0504354dec40> in <module>()
----> 1 int(float('inf'))

OverflowError: cannot convert float infinity to integer
Antworten