17

我遇到了意想不到的行为,希望有人能就重点调查的领域提供一些指导。

我有两种方法,一种本质上是对双精度执行除以零测试,第二种调用extern非托管 dll 的方法。

注意:在 .Net 运行时,将 Double 除以零应该返回一个 Infinity 值(有趣的是正面或负面的味道)。

我正在做的伪代码看起来像这样:

InfinityTest(); // Returns an Infinity value as expected
DllCall();
InfinityTest(); // Divide by zero error on second call.

第一次调用InfinityTest()按预期返回值 Infinity。第二次调用InfinityTest()引发了我没想到的除以零异常。

更新

下面的有效InfinityTest()代码。为简洁起见,我删除了 try/catch 元素等。我无权详细介绍DllCall()伪代码元素,抱歉。

private double InfinityTest()
{
    double a = 1.0;
    int b = 0;
    return a / b;
}
4

1 回答 1

13

由于听起来您的 DLL 正在更改您身上的 FP 状态字,因此您唯一的选择可能是将其更改回来。我建议 P/Invoke 到_clearfpor _fpreset。以下是他们的 P/Invoke 签名:

    [DllImport("msvcrt.dll")]
    static extern UInt32 _clearfp();
    [DllImport("msvcrt.dll")]
    static extern void _fpreset();

这可能不会将事情重置回原来的样子,但希望它会足够接近。

于 2011-04-19T16:52:36.067 回答