2010-06-09 6 views
6

Ich habe ein COM-Objekt mit einer Funktion mit einem optionalen letzten Argument. Die IDL ist ein bisschen wie folgt aus:Warum sehen IDL-Standardwerte abgerundet aus?

interface ICWhatever: IDispatch 
{ 
    [id(96)] HRESULT SomeFunction([in,defaultvalue(50.6)]float parameter); 
}; 

Dies funktioniert: Wenn ich den Parameter nicht angeben, 50,6 ausgefüllt wird Aber in mehreren Entwicklungsumgebungen (Excel VBA, VB6) wird der Standardwert gerundet. vor der Anzeige. Nachdem die offene Klammer eingeben, ich sehe:

Funktion ([Parameter A Single = 51])

Wer weiß, warum das so ist? Ist es ein Fehler? Dies wird Client-Programmierer verwirren ...

Antwort

1

ich in der Lage war, das Problem, das Sie erlebte (VBA) zu reproduzieren, und es scheint in der Tat ein Fehler in der Behandlung der Single Art von (insbesondere) VB IDEs zu sein. Die VB-IDEs werden nämlich den Single Standardwert auf int vor dem erneuten Ausdruck (als Teil der Methodensignatur) als (abgeschnittenen) Gleitkommawert mit einfacher Genauigkeit falsch übertragen.

Dieses Problem existiert nicht in dem Microsoft Skript-Editor, noch existiert es in OleView.exe usw.

Um zu testen, versuchen Sie den folgenden Single Standardwert: 18446744073709551615.0. In meinem Fall wird dieser Wert korrekt im TLB codiert und von OleView.exe und Microsoft Script Editor als 1.844674E+19 richtig angezeigt. Es wird jedoch in den VB IDEs als -2.147484E+09 angezeigt. In der Tat erzeugt das Gießen (float)18446744073709551615.0 zu int-2147483648, die, angezeigt als float, den beobachteten (falschen) VB IDE-Ausgang -2.147484E+09 erzeugt.

In ähnlicher Weise wird 50.6 in int umgewandelt, um 51 zu produzieren, das dann als 51 ausgedruckt wird. verwenden Double statt Single

, um dieses Problem zu umgehen, wie Double umgewandelt und angezeigt richtig von allen IDEs konnte ich testen.


Auf einer Tangente, sind Sie wahrscheinlich bereits die Tatsache bewusst, dass bestimmt Gleitkommawerte (wie 0.1) keine entsprechende genaue IEEE 754 Darstellung haben und von anderen Werten können nicht (zB unterscheiden 0.1000000015.) Daher wird in den meisten IDEsals 0.1Standard 0.100000001490116 angezeigt. Eine Möglichkeit, dieses Präzisionsproblem zu verringern, besteht darin, für Ihre Parameter eine andere Skalierung zu wählen (z. B. von Sekunden auf Millisekunden umzuschalten). Somit werden 0.1 Sekunden zu 100 Millisekunden, die eindeutig als Gleitkommawerte mit einfacher und doppelter Genauigkeit dargestellt werden können. Parameter.)

Verwandte Themen