【发布时间】:2011-04-19 16:33:14
【问题描述】:
我遇到了意外的行为,希望有人能提供一些指导,帮助我了解重点调查的领域。
我有两种方法,一种是对双精度执行除以零测试,第二种为非托管 dll 调用 extern 方法。
注意:在 .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;
}
【问题讨论】:
-
哎哟!看起来 DLL 调用更改了一些 FP 标志并且没有将它们放回原处。 :(
-
我们能得到这两种方法的代码吗?更重要的是
infinityTest(); -
你能从“InfinityTest();”中发布代码吗?你能告诉我们 DllCall 是做什么的吗?是否有任何引用传递给 DllCall?
-
DLL 是不是用 Delphi 编写的?多年前,我在开发 VBScript 解释器时遇到了同样的问题。 VBScript 假设浮点错误在 FP 芯片上静默设置错误位; Delphi 假定浮点错误会导致异常,并将重置芯片的行为以满足其预期。
-
前几天我遇到了这个问题,我在 .NET 分析器中从
QueryPerformanceCounter更改为QueryThreadCycleTime并开始在分析的应用程序中出现奇怪的 DivideByZero 异常。
标签: c# .net double divide-by-zero