... please wait while loading ...

To view the complete site without permanently having to scroll, your browser-window should be maximized to support your screen-resolution of .
Belegung
germany
  8.595.553 Nedstat Basic - Kostenlose web site statistiken Persönliche Homepage webseite Zähler
Kostenlose Zähler
In memoriam C-BIT Information-Center Hannover (2.241/1075+2.241/1076 - no longer active)
Suchmaschinen-Optimierung Webdesign Hirschfeld Elbe Elster Webdesign Hirschfeld Elbe Elster
Sicherheitshinweis: Wir weisen vorsorglich darauf hin, dass wir bei der Anmeldung saemtliche automatisch uebermittelten Parameter wie IP-Adresse und/oder Einwahlrufnummer speichern, um uns und unsere Kunden vor Missbrauch zu schuetzen. Selbstverstaendlich werden wir bei Bedarf umgehend strafrechtliche Massnahmen ergreifen, um einen vorliegenden Missbrauch zu ahnden.

PRB: Runden von Fehler, der Verdopplung zu Long-Wert umwandelt

ACHTUNG: Der folgende Knowledge Base Artikel wurde durch ein maschinelles Übersetzungssystem ohne jegliche menschliche Mitwirkung übersetzt. Microsoft stellt diese Artikel deutschsprachigen Benutzern, die der englischen Sprache nicht mächtig sind, als Hilfe zur Verfügung, damit diese den Inhalt dieser Artikel verstehen können. Microsoft übernimmt keine Gewähr für die sprachliche Qualität oder die technische Richtigkeit der Übersetzungen und ist nicht für Probleme haftbar, die direkt oder indirekt durch Übersetzungsfehler oder die Verwendung der übersetzten Inhalte durch Kunden entstehen könnten.
Artikel-ID:12297
Geändert am:Montag, 1. Dezember 2003
Version:2.0
Auf dieser Seite

Problembeschreibung

Anwendungserzeugen, die falsche Ergebnisse, wenn es einen Ausdruck umwandelt, Verdopplung eingeben, um lange einzugeben.

Zum Anfang

Ursache

Der Fehler wird von Unterschieden in arithmetischer Genauigkeit verursacht.

Zum Anfang

Status

Die C-- und Die C++-Standards geben an, dass die Nummer zu Null abgeschnitten wird, wenn eine Anwendung eine Gleitzahl zu einer ganzen Zahl konvertiert. Wenn das Runden das bevorzugte Verhalten ist kann die Anwendung 0,5 wie geeignetes hinzufügen oder 0,5 wie geeignetes subtrahieren, so erzielt Kürzung das korrekte Ergebnis. Für diese Zwecke stellt der folgende Text einen Makro dar.

Zum Anfang

Weitere Informationen

Wenn dieses Verhalten mit allem Unverankert kompiliert wird, wird dieses Verhalten in dem folgenden Codebeispiel veranschaulicht Sie verweisen mathematische Option anders als /FPa. Die Anwendung zeigt -4049 als den Wert für Long2 und Long4 an, was es ist falsch. Die Anwendung zeigt den richtigen Wert -4050 für Long1 und Long3 an.

Zum Anfang

Beispielcod

/*
 * Compile options needed: /FPc or /FPc87 or /FPi or /FPi87
 */ 

#include "stdio.h"
main()
{
   long    val1, val2, val3;
   double  mul1, mul2;
   val1 = 45000;
   mul1 = 0.09;
   mul2 = (double)val1 * mul1 * -1.00;
   printf("%7ld Long1 ", (long)mul2);
   val2 = (long)mul2;
   printf("%7ld Long2 ", (long)((double)val1 * mul1 * -1.00));
   printf("%7ld Long3 ", val2);
   val3 =(long)((double)val1 * mul1 * -1.00);
   printf("%ld Long4 \n", val3);
}
				
Die Anwendung führt zu den falschen Ergebnissen, indem die Anwendung einen realen ungeprüften Wert zu einem Long-Wert konvertiert; die Anwendung führt zu korrekten Ergebnissen, indem die Anwendung ein ungeprüftes Real zu einem 8-Bytereal konvertiert und den Wert zu einem Long-Wert konvertiert.

Die Konvertierung eines ungeprüften Reals zu einem 8-Bytereal rundet gemäß den Typenkonvertierungsregeln die Zahl von -4049.99999999999985 zu -4050.0. Die Anwendung konvertiert diesen Wert zu einem Long-Wert den Ergebnissen Wert -4050 wann. Wenn die Anwendung den doppelten Wert zu einem Long-Wert direkt konvertiert, schneidet die Anwendung jedoch zu Null ab. In diesem Beispiel wird -4049.99999999999985 -4049.

Mehr Zahlen (wie .01) wiederholen Brüche in der Nummerierung-Binär-Datei von System, das genau nicht dargestellt werden kann. Beliebige Darstellung dieser Zahlen ist ein wenig mehr oder weniger als dem "echte" Wert. Wenn eine Berechnung einen dieser Werte umfasst wird der Darstellungsfehler weitergegeben und kann vergrößert werden. Nur bei dem Verlieren einer Berechnung von Genauigkeit in einem Zwischen-Wert treten Fehler auf, da der Fehler nur in dem niederwertigesten Teil der Zahl vorhanden ist.

Die Konvertierungen schneiden immer zu Null ab. Der folgende Makro rundet die Zahl effektiv, indem 0,5, das die Zahl in einer Zahl zu einer ganzen Zahl anschließend konvertiert, die Größenordnung der Zahl erhöht.
   #define ROUNDL( d ) ((long)((d) + ((d) > 0 ? 0.5 : -0.5)))
				
Das Problem tritt bei den Microsoft Visual C++ 32-bit-Editionen nicht auf, als Win32 den langen Doubeln-Datentypen aus Gründen von Kompatibilität nicht unterstützt.

Weitere Informationen zu dem Konvertieren von Gleitkommazahlen zu ganzen Zahlen finden Sie in dem Typenkonvertierungsabschnitt des "C Language Reference" Handbuchs.

Zum Anfang


Die Informationen in diesem Artikel beziehen sich auf:
 Microsoft C Professional Development System 5.1
 Microsoft C Professional Development System 6.0
 Microsoft C Professional Development System 6.0a
 Microsoft C Professional Development System 6.0a
 Microsoft C Professional Development System 5.1
 Microsoft C Professional Development System 6.0
 Microsoft C Professional Development System 6.0a
 Microsoft C/C++ Professional Development System 7.0
 Microsoft Visual C++ 1.0 Professional Edition
 Microsoft Visual C++ 1.5 Professional Edition
 Microsoft Visual C++ 1.51
 Microsoft Visual C++ 1.52 Professional Edition

Zum Anfang

Microsoft stellt Ihnen die in der Knowledge Base angebotenen Artikel und Informationen als Service-Leistung zur Verfügung. Microsoft übernimmt keinerlei Gewährleistung dafür, dass die angebotenen Artikel und Informationen auch in Ihrer Einsatzumgebung die erwünschten Ergebnisse erzielen. Die Entscheidung darüber, ob und in welcher Form Sie die angebotenen Artikel und Informationen nutzen, liegt daher allein bei Ihnen. Mit Ausnahme der gesetzlichen Haftung für Vorsatz ist jede Haftung von Microsoft im Zusammenhang mit Ihrer Nutzung dieser Artikel oder Informationen ausgeschlossen.


This mirror is sponsored by:
Hansjoerg G. Henker
A-Z Consulting & Development
[1.254]

Information-Center [11.09.2010 04:55:40]