なぜIDL DefaultValue値が丸みを帯びているように見えるのですか?

StackOverflow https://stackoverflow.com/questions/3007621

  •  26-09-2019
  •  | 
  •  

質問

オプションの最後の引数を持つ関数を備えた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.0int 生成 -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 ミリ秒、単一精度の浮動ポイントと積分値/パラメーターの両方として明確に表現できます。)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top