🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: de.comp.lang.c++
Article #1280

Re: float

#1280
From: Dietmar Kuehl
Date: Mon, 15 Jan 1996 05:08
49 lines
2988 bytes
Hi,
Mark Halter (st000217@hrz1.hrz.th-darmstadt.de) wrote:
: kann mir jemand erklaeren, wie ein float-Zahl binaer dargestellt wird?

Moechtest Du das informal wissen oder moechtest Du die exacte
Definition haben?  Letzteres ist System abhaengig und natuerlich
abhaengig von der Groesse der Zahl ('float', 'double', 'long double';
allerdings hast Du ja explizit nach 'float' gefragt, obwohl damit
normalerweise nicht gerechnet wird: es wird normalerweise mindestens
mit 'double' gerechnet). Die exakte Definition findest Du vermutlich am
ehesten im IEEE Standard.

Ungefaehr (informal) werden 'float's typischerweise folgendermassen
dargestellt: Der Wert wird berechnet als 'sign * mantisse * pow(base,
exponent)' (die Berechnung wird so natuerlich nicht durchgefuehrt: Die
Expression ist nur informal, um zu beschreiben, wie die Zahl
dargestellt wird), d.h. es wird eine Mantisse, ein Exponent und ein
Vorzeichen-Bit abgespeichert.  'base' ist abhaengig von der Hardware.
Typische Werte fuer 'base' sind 2 oder 16 (aus "POSIX Programmer's
Guide", D.Lweine, O'Reilly).  Die Anzahl der Bits, die zur Darstellung
von 'exponent' und 'mantisse' verwendet werden unterscheiden sich
ebenfalls auf verschiedenen Platformen (bei verschieden Compilern auf
der selben Platform sollten sie gleich sein; das ist allerdings nicht
unbedingt garantiert).

Die Mantisse wird so gespeichert, dass die Zahl mit '0.' beginnt. Dann
braucht man die Stelle vor dem Komma und die Position des Kommas nicht
zu speichern. Insgesamt sieht die Zahl also etwa so aus:

  0 1                     24 25     31
  | |                     |  |      |
  s mmmmmmmmmmmmmmmmmmmmmmm  eeeeeeee

Wobei 's' das Bit ist, das das Vorzeichen darstellt (etwa '1' =>
positiv; '0' => negativ), 'm' fuer ein Bit der Mantisse steht und 'e'
ein Bit des Exponenten ist. Die Anzahl der jeweiligen Bits muesste auf
ein 'float' auf einer Sparc-Station passen. Die Reihenfolge nicht
unbedingt... (ich habe gerade nichts da, was die IEEE Definition
enthaelt).

In 'float.h' sind eine Reihe von Konstanten definiert, mittels denen
man abschaetzen kann, wie ein 'float' (oder ein '[long] double')
dargestellt ist. Nach dem DWP sollte man dafuer 'numeric_limits'
verwenden (18.2.1; lib.limits). Allerdings habe ich keinen
Compiler/Library, der diese Template-Klasse definiert.
--
dietmar.kuehl@uni-konstanz.de
http://www.informatik.uni-konstanz.de/~kuehl
I am a realistic optimist - that's why I appear to be slightly pessimistic
Technical Details
Message-ID: <30f9e131.0@news.uni-konstanz.de>
Path: arc1-ca.pugleaf.net!news.uni-konstanz.de!uzwil!kuehl
References: <4dbfci$1dap@rs18.hrz.th-darmstadt.de>

Show Full Headers
Complete Article Headers
From: kuehl@uzwil.informatik.uni-konstanz.de (Dietmar Kuehl)
Subject: Re: float
Newsgroups: de.comp.lang.c++
References: <4dbfci$1dap@rs18.hrz.th-darmstadt.de>
Organization: Fakultät für Mathematik und Informatik
Reply-To: dietmar.kuehl@uni-konstanz.de
X-Newsreader: TIN [version 1.2 PL2]
NNTP-Posting-Host: uzwil.informatik.uni-konstanz.de
Message-ID: <30f9e131.0@news.uni-konstanz.de>
Date: 15 Jan 96 05:08:01 GMT
Path: arc1-ca.pugleaf.net!news.uni-konstanz.de!uzwil!kuehl