2017-10-07 3 views
0

In diesem Beispiel: mit Dezimal-ähnlicher PräzisionPython - warum erzeugt die Multiplikation von long und float eine dezimalähnliche Antwort?

long_ten = 10**21 
print(' type(long_ten):', type(long_ten)) 
print('  long_ten: {:52,f}'.format(long_ten)) 
tenth = 0.1 
print(' type(tenth):', type(tenth)) 
print(' float(52f): {:52.52f}'.format(tenth)) 
float_res = tenth * long_ten 
print('\n type(float_res):', type(float_res)) 
print(' float(52f): {:15.52f}'.format(float_res)) 

Warum in einem Schwimmer ein lange und Schwimmer Ergebnis multipliziert?

type(long_ten): <type 'long'> 
long_ten:     1,000,000,000,000,000,000,000.000000 
type(tenth): <type 'float'> 
float(52f): 0.1000000000000000055511151231257827021181583404541016 

type(float_res): <type 'float'> 
float(52f): 100000000000000000000.0000000000000000000000000000000000000000000000000000 

Ich würde erwarten, das Ergebnis zu sein:

100000000000000005551.1151231257827021181583404541016... 

Ich verstehe, warum das Ergebnis Typ float - b/c es

HINWEIS lange breiter als - das ist mit Python 2 (wenn das wichtig ist)

+0

Zehntel geht verloren in der relativen Präzision – percusse

Antwort

0

Gleitkommazahlen sind nur eine bestimmte Gruppe von Brüchen, deren Nenner Potenzen von 2 sind. 2^- n hat n Nachkommastellen, so kann ein float leicht 53 Ziffern ungleich Null haben (mehr für große Zahlen, da keine Potenz von 2 eine Potenz von 10 ist). Sie drucken gerade (fast) diese "volle" Nummer; Das tun wir normalerweise nicht, da alle außer den ersten 16 (oder so) nur "Rauschen" sind, das von diesen ersten paar bestimmt wird.

2

100000000000000000000 ist darstellbare als float:

>>> n = 100000000000000000000 
>>> int(float(n)) 
100000000000000000000L 

Die nächst größere Schwimmer ist 100000000000000016384:

>>> from itertools import count 
>>> next(int(float(i)) for i in count(n) if int(float(i)) != n) 
100000000000000016384L 

So Schwimmer am nächsten zu Ihrem erwarteten 100000000000000005551,115 ... 100000000000000000000 ist, so dass das, was man bekommt .

Warum sind Floats diese großen immer ganze Zahlen? Nun können Sie in binärer sehen, es ist bereits 67 Bits:

>>> bin(n) 
'0b1010110101111000111010111100010110101100011000100000000000000000000' 
>>> len(bin(n)[2:]) 
67 

Aber floats only store the most significant 53 bits. Da also das Frontbit 2 wert ist, ist das Tailbit bereits 2 66-52 = 16384 wert. Wie wir oben schon gesehen haben. Also sind alle 53 Bits ganze Zahlen und somit ist die ganze Zahl auch eine ganze Zahl.

Verwandte Themen