Konvertiere int in float: wie es gemacht wird

7

Ich bin neu in der C-Programmiersprache, und ich würde gerne eine Frage stellen.

Integer ich hier ist Gießen zu float dann f (irgendwie) stellt erfolgreich 5.0:

%Vor%

Allerdings, wenn wir diesen Ansatz versuchen:

%Vor%

f würde NICHT 5.0 bekommen, da es die in i gespeicherten Bits auf "float's way" interpretiert. Welche Magie macht der Compiler im ersten Fall eigentlich? Es scheint eine ziemlich anstrengende Arbeit zu sein ... Kann jemand das spezifizieren? Danke.

    
Xu Hong 20.07.2012, 15:14
quelle

7 Antworten

13

Es ist ein mühsamer Job, aber jede CPU mit Floating-Point-Unterstützung wird eine entsprechende Anweisung bereitstellen.

Wenn Sie ein Zweierkomplement int in IEEE-Float-Format für sich selbst konvertieren müssten, würden Sie:

  • nimm das Integer-Base-2-Protokoll (eng verwandt mit dem Index des höchsten gesetzten Bits), was dir den Exponenten gibt. Versetze dies und speichere es in den Exponentenbits des Floats.
  • Kopiere die obersten n -Bits von int (beginnend mit dem Bit nach das erste Zeichen ohne Vorzeichen) in den manificand des float. n sind jedoch viele Bits von significand, die es in einem float gibt (23 für einen 32-Bit Float mit einfacher Genauigkeit). Wenn im int noch Bits übrig sind (dh wenn es größer als 2 24 ist) und das nächste Bit nach dem, für das Sie Platz haben, 1 ist, dürfen Sie oder dürfen nicht aufrunden abhängig vom IEEErundungsmodus im Betrieb.
  • Kopieren Sie das Vorzeichenbit von int in float .
Steve Jessop 20.07.2012 15:16
quelle
6

Wenn Sie sich die Baugruppe ansehen

%Vor%

fild ist was macht die Magie

    
parapura rajkumar 20.07.2012 15:29
quelle
2

Auf den IA32-Systemen würde der Compiler Folgendes generieren: -

%Vor%     
Skizz 20.07.2012 15:30
quelle
2
___ qstntxt ___

Ich bin neu in der C-Programmiersprache, und ich würde gerne eine Frage stellen.

Integer ich hier ist Gießen zu float dann f (irgendwie) stellt erfolgreich 5.0:

%Vor%

Allerdings, wenn wir diesen Ansatz versuchen:

%Vor%

f würde NICHT 5.0 bekommen, da es die in i gespeicherten Bits auf "float's way" interpretiert. Welche Magie macht der Compiler im ersten Fall eigentlich? Es scheint eine ziemlich anstrengende Arbeit zu sein ... Kann jemand das spezifizieren? Danke.

    
___ answer11582411 ___

Auf den IA32-Systemen würde der Compiler Folgendes generieren: -

%Vor%     
___ antwort43994101 ___

konvertiert int Bits in float

%Vor%     
___ answer11582393 ___

Wenn Sie sich die Baugruppe ansehen

%Vor%

fild ist was macht die Magie

    
___ answer11582147 ___

Es ist ein mühsamer Job, aber jede CPU mit Floating-Point-Unterstützung wird eine entsprechende Anweisung bereitstellen.

Wenn Sie ein Zweierkomplement %code% in IEEE-Float-Format für sich selbst konvertieren müssten, würden Sie:

  • nimm das Integer-Base-2-Protokoll (eng verwandt mit dem Index des höchsten gesetzten Bits), was dir den Exponenten gibt. Versetze dies und speichere es in den Exponentenbits des Floats.
  • Kopiere die obersten %code% -Bits von int (beginnend mit dem Bit nach das erste Zeichen ohne Vorzeichen) in den manificand des float. %code% sind jedoch viele Bits von significand, die es in einem %code% gibt (23 für einen 32-Bit Float mit einfacher Genauigkeit). Wenn im %code% noch Bits übrig sind (dh wenn es größer als 2 24 ist) und das nächste Bit nach dem, für das Sie Platz haben, %code% ist, dürfen Sie oder dürfen nicht aufrunden abhängig vom IEEErundungsmodus im Betrieb.
  • Kopieren Sie das Vorzeichenbit von %code% in %code% .
___ answer11582342 ___

Die Magie hängt von Ihrer Plattform ab.

Eine Möglichkeit besteht darin, dass Ihre CPU eine spezielle Anweisung zum Kopieren von Fließkommazahlen in ganzzahlige Register hat.

Natürlich muss jemand diese CPUs entwerfen, also ist dies nicht wirklich eine Erklärung für den Algorithmus.

Eine Plattform verwendet möglicherweise ein Fließkommaformat, das so aussieht (tatsächlich ist dies ein Festkommaformat, um es zu verdeutlichen):

%Vor%

wobei %code% das Vorzeichen ist, die %code% s der Teil vor dem Punkt sind, die %code% s der Teil nach dem Punkt sind, z. (Punkt ist virtuell und nur für die Präsentation)

%Vor%

In diesem Fall ist die Konvertierung fast trivial und kann mit Bitshifting implementiert werden:

%Vor%

Und wie in diesem Beispiel verwenden Commodity-C ++ - Implementierungen eine Fließkommadarstellung, die oft als IEEE Fließkomma bezeichnet wird, siehe auch IEEE 754-1985 . Diese sind komplizierter als Festkommazahlen, da sie wirklich eine einfache Formel der Form _s * m n bezeichnen, jedoch haben sie eine gut definierte Interpretation und Sie können Entfalte sie zu etwas, das besser geeignet ist.

    
___ tag123c ___ C ++ ist eine universelle Programmiersprache. Es wurde ursprünglich als Erweiterung von C entworfen und behält eine ähnliche Syntax, ist aber jetzt eine komplett andere Sprache. Verwenden Sie dieses Tag für Fragen zu Code, der mit einem C ++ - Compiler kompiliert werden soll. ___ tag123c ___ C ist eine universelle Computerprogrammiersprache, die für Betriebssysteme, Bibliotheken, Spiele und andere Hochleistungsanwendungen verwendet wird. Dieses Tag sollte bei allgemeinen Fragen zur C-Sprache verwendet werden, wie in der Norm ISO 9899: 2011 definiert. Fügen Sie ggf. ein versionsspezifisches Tag wie c99 oder c90 für Fragen zu älteren Sprachstandards hinzu. C unterscheidet sich von C ++ und es sollte nicht mit dem C ++ - Tag kombiniert werden, wenn ein rationaler Grund fehlt. ___ answer11582349 ___

In fast allen modernen Systemen ist die Spezifikation für Fließkomma-Arithmetik der IEEE754-Standard. Dies zeigt alles vom Layout im Speicher bis hin zur Ausbreitung und Abrundung. Es ist ein großes Gebiet und etwas, das Sie ziemlich oft ausführlich in der wissenschaftlichen und technischen Programmierung berücksichtigen müssen.

    
___ tag123typeconversion ___ Die Typkonvertierung ist die Art und Weise, wie eine Entität eines Datentyps implizit oder explizit in eine andere geändert wird. Dies geschieht, um bestimmte Merkmale von Typhierarchien oder Typendarstellungen auszunutzen. ___ answer11582432 ___

Nun, ich habe gerade den fraglichen Code unter VC ++ kompiliert und die Disassemblierung betrachtet:

%Vor%     
___ tag123casting ___ Casting ist ein Prozess, bei dem ein Objekttyp explizit in einen anderen Typ konvertiert wird, wenn die Konvertierung zulässig ist. Dieser Prozess könnte zu einer Wertänderung führen. ___ qstnhdr ___ Konvertiere int in float: wie es gemacht wird ___
Pankaj Kumar Boora 16.05.2017 06:37
quelle
1

Die Magie hängt von Ihrer Plattform ab.

Eine Möglichkeit besteht darin, dass Ihre CPU eine spezielle Anweisung zum Kopieren von Fließkommazahlen in ganzzahlige Register hat.

Natürlich muss jemand diese CPUs entwerfen, also ist dies nicht wirklich eine Erklärung für den Algorithmus.

Eine Plattform verwendet möglicherweise ein Fließkommaformat, das so aussieht (tatsächlich ist dies ein Festkommaformat, um es zu verdeutlichen):

%Vor%

wobei s das Vorzeichen ist, die I s der Teil vor dem Punkt sind, die F s der Teil nach dem Punkt sind, z. (Punkt ist virtuell und nur für die Präsentation)

%Vor%

In diesem Fall ist die Konvertierung fast trivial und kann mit Bitshifting implementiert werden:

%Vor%

Und wie in diesem Beispiel verwenden Commodity-C ++ - Implementierungen eine Fließkommadarstellung, die oft als IEEE Fließkomma bezeichnet wird, siehe auch IEEE 754-1985 . Diese sind komplizierter als Festkommazahlen, da sie wirklich eine einfache Formel der Form _s * m n bezeichnen, jedoch haben sie eine gut definierte Interpretation und Sie können Entfalte sie zu etwas, das besser geeignet ist.

    
Sebastian Mach 20.07.2012 15:26
quelle
0

In fast allen modernen Systemen ist die Spezifikation für Fließkomma-Arithmetik der IEEE754-Standard. Dies zeigt alles vom Layout im Speicher bis hin zur Ausbreitung und Abrundung. Es ist ein großes Gebiet und etwas, das Sie ziemlich oft ausführlich in der wissenschaftlichen und technischen Programmierung berücksichtigen müssen.

    
David G 20.07.2012 15:26
quelle
0

Nun, ich habe gerade den fraglichen Code unter VC ++ kompiliert und die Disassemblierung betrachtet:

%Vor%     
Joseph Willcoxson 20.07.2012 15:31
quelle

Tags und Links