なぜIDL DefaultValue値が丸みを帯びているように見えるのですか?
質問
オプションの最後の引数を持つ関数を備えたcomオブジェクトがあります。 IDLはこのようなものです:
interface ICWhatever: IDispatch
{
[id(96)] HRESULT SomeFunction([in,defaultvalue(50.6)]float parameter);
};
これは正常に機能します。パラメーターを指定しないと、50.6が記入されます。しかし、いくつかの開発環境(Excel VBA、VB6)では、デフォルト値は表示前に丸められます。開いたブレースを入力した後、私は次のように見えます:
いくつかの機能([単一= 51としてのパラメーター])
なぜこれがなぜなのか知っていますか?バグですか?これはクライアントプログラマーを混乱させます...
解決
私はあなたが経験した問題(VBA)を再現することができました、そしてそれは本当にそうであるようです の治療のバグ Single
(具体的には)VB IDEによって入力します. 。つまり、VB IDEは不適切にキャストされます Single
デフォルト値に int
(メソッド署名の一部として)(切り捨てられた)単一精度の浮動小数点値として再び(メソッド署名の一部として)印刷する前に。
この問題はに存在しません Microsoftスクリプトエディター, 、それは存在しません OleView.exe
等
テストするには、以下を試してください Single
デフォルト値: 18446744073709551615.0
. 。私の場合、この値はTLBで適切にエンコードされ、によって適切に表示されます OleView.exe
そしてによって Microsoftスクリプトエディター なので 1.844674E+19
. 。ただし、として表示されます -2.147484E+09
VB IDESで。確かに、キャスティング (float)18446744073709551615.0
に int
生成 -2147483648
ASとして表示されます float
, 、観測された(間違った)VB IDE出力を生成します -2.147484E+09
.
同様に、 50.6
にキャストされます int
生産する 51
, 、次に印刷されます 51
.
この問題を回避するために使用します Double
それ以外の Single
, 、 なので Double
変換されます 適切に表示されます すべてのIDEによって、私はテストすることができました。
接線では、あなたはおそらく特定の浮動小数点値( 0.1
)対応するものはありません ちょうど IEEE 754表現と他の値と区別することはできません(例: 0.1000000015
。)したがって、デフォルトを指定します 二重精度 の値 0.1
ほとんどのIDESとして表示されます 0.100000001490116
. 。この精密な問題を軽減する1つの方法は、パラメーターの異なるスケールを選択することです(たとえば、秒からミリ秒への切り替え、したがって 0.1
秒はなります 100
ミリ秒、単一精度の浮動ポイントと積分値/パラメーターの両方として明確に表現できます。)