Konvertierung von unsigned int zu float
warning C4244: '=' : conversion from 'unsigned int' to 'float', possible loss of data
Sollte nicht ein schweben der Lage sein, jede Wert aus einer int?
unsigned int: 0 to 4,294,967,295
float 3.4E +/- 38 (7 digits)
Wiki:
The advantage of floating-point representation over fixed-point (and
integer) Darstellung ist, dass es
die Unterstützung einer viel breiteren Palette von Werten.
Jede Einsicht wäre hilfreich, danke.
http://msdn.microsoft.com/en-us/library/s3f49ktz%28VS.80%29.aspx
InformationsquelleAutor T.T.T. | 2010-08-04
Du musst angemeldet sein, um einen Kommentar abzugeben.
'unsigned int' und 'float', beide 32-bit-Werte speichern. Da ein float hat eine größere Reichweite, es unbedingt opfert etwas an Präzision. Dies bedeutet, dass es einige unsigned int-Werte, die nicht richtig dargestellt werden in einen float. MSDN bietet einige weitere details.
InformationsquelleAutor JaredReisinger
Während
float
unterstützt eine breitere Palette von Werten alsunsigned int
, Sie tut es mit weniger Genauigkeit. Schwebt ein 23-bit-Mantisse, die, wie du gepostet hast, ist nur etwa 7 Dezimalstellen. unsigned ints Unterstützung über 9 Dezimalstellen.Vorschlag: verwenden Sie
double
, nichtfloat
.Edit:
Tatsächlich, ich zurückziehen, Vorschlag; floating-point und integer-Datentypen sind grundsätzlich Verschieden und sind nicht direkt umsetzbar. Was integer-Wert erwarten Sie für
Single.MaxValue
? FürSingle.NegativeInfinity
? Zu erklären, warum Sie konvertieren möchten ausfloat
zuint
wäre hilfreich.InformationsquelleAutor Dour High Arch
Als Sie Hinweis in Ihrer Frage, die float-dauert nur 7 Ziffern, im Gegensatz zu den 10-stellig in INT_MAX. Ich glaube, das wäre der Grund zu geben, eine C4244 Warnung an dieser Umwandlung.
Sie können Lesen wollen en.wikipedia.org/wiki/Floating_point um mehr zu erfahren darüber, wie Gleitkommazahlen dargestellt werden, insbesondere die Art und Weise die bits sind divvied up zwischen Mantisse und exponent.
float Griff zu dem Bereich, verliert jedoch die Präzision (ie., Sie verlieren einige der am wenigsten signifikanten Ziffern). Das ist ein Verlust von Daten, so dass die Warnung angebracht ist.
z.B., versuchen Sie speichert sowohl 4_000_000_000 und 4_000_000_001 in Ihrem Wagen, und sehen, welchen Wert Sie haben.
Ok, ich verstehe es jetzt, danke.
InformationsquelleAutor You
Vom wikipedia:
Mit einem int mit 32 bit (in der Regel) und eine float mit 32 bit (mit Teil reserviert für den Exponenten), es gibt eine Menge von int-Werten kann nicht genau dargestellt werden, indem die floating-point-Typ.
InformationsquelleAutor sje397
versuchen, diese situation zu verstehen
und Sie werden sehen, dass dies wirklich eine unendliche Schleife, auf Systemen, auf denen int ist 32 bit oder weniger.
Was interessant sein wird ist, brechen in die unendlichen Schleife und sehen, was der Wert für f, so dass f == f + 1
printf("%f\n", float(1<<24)+1)
druckt eine gerade Zahl, das ist offensichtlich falsch.InformationsquelleAutor franji1