6

オプションの最後の引数を持つ関数を持つ COM オブジェクトがあります。IDL は次のようになります。

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

これは問題なく動作します。パラメーターを指定しない場合、50.6 が入力されます。ただし、いくつかの開発環境 (Excel VBA、VB6) では、既定値は表示前に丸められます。左中かっこを入力すると、次のように表示されます。

SomeFunction( [パラメータ As Single = 51 ] )

これがなぜなのか誰か知っていますか?バグですか?これは、クライアント プログラマーを混乱させるでしょう...

4

1 に答える 1

1

あなたが経験した問題 (VBA) を再現することができました。これは、(特に) VB IDE による型の処理のバグのSingleようです。つまり、VB IDE は、Singleデフォルト値をint(メソッド シグネチャの一部として) (切り捨てられた) 単精度浮動小数点値として再度出力する前に、不適切にキャストします。

この問題はMicrosoft Script Editorには存在せず、その他にも存在しませんOleView.exe

Singleテストするには、次のデフォルト値を試してください: 18446744073709551615.0. 私の場合、この値は TLB で適切にエンコードされ、Microsoft Script EditorOleView.exeによってとして適切に表示されます。ただし、VB IDE と同じように表示されます。実際、 にキャストすると、 として表示され、観測された (正しくない) VB IDE 出力が生成されます。1.844674E+19-2.147484E+09(float)18446744073709551615.0int-2147483648float-2.147484E+09

同様に、50.6は にキャストされてintを生成51し、 として出力され51ます。

この問題を回避するDoubleSingleには、私がテストできたすべての IDEDoubleで変換され、適切に表示されるように、代わりに を使用します。


タンジェントでは、特定の浮動小数点値 ( など0.1) には対応する正確なIEEE 754 表現がなく、他の値 ( など) と区別できないという事実におそらくすでに気付いているでしょう0.1000000015。したがって、デフォルトの倍精度値を指定するof0.1は、ほとんどの IDE で として表示され0.100000001490116ます。この精度の問題を軽減する 1 つの方法は、パラメーターに別のスケールを選択することです (たとえば、秒からミリ秒に切り替えると、秒がミリ秒に0.1なり100、単精度と倍精度の両方の浮動小数点、および整数値/パラメーターとして明確に表現できます)。 )

于 2010-09-09T19:38:29.740 に答える