0
我写了下面行C#_controlfp并不妨碍DivideByZeroException
using System;
using System.Runtime.InteropServices;
namespace ConsoleApplication1
{
class Program
{
[DllImport("msvcrt.dll", CallingConvention = CallingConvention.Cdecl)]
extern static uint _controlfp(uint newcw, uint mask);
const uint _MCW_EM = 0x0008001f;
public const uint EM_INVALID = 0x00000010;
public const uint EM_DENORMAL = 0x00080000;
public const uint EM_ZERODIVIDE = 0x00000008;
public const uint EM_OVERFLOW = 0x00000004;
public const uint EM_UNDERFLOW = 0x00000002;
public const uint EM_INEXACT = 0x00000001;
static void MaskFpu(uint pExceptionMask = EM_INVALID)
{
// add desired values
_controlfp(_MCW_EM, pExceptionMask);
}
static void Main(string[] args)
{
MaskFpu(EM_ZERODIVIDE);
int a = 0;
var b = 5/a;
Console.WriteLine("b = " + b);
}
}
}
Main方法开始通过设置控制字。显然我想要DivideByZeroExceptions被屏蔽。
执行完_controlfp后,我期望零除以返回NaN。但是var b = 5/a
反而会引发异常。
我该如何真正让我的过程不会引发DivideByZeroExceptions?
如果你实际上只是在你的测试中使用了浮点类型,你不会需要任何这个容易出错的遗留垃圾。尝试一下。 – leppie
我期望'controlfp'来控制*浮点操作 - 你正在执行整数操作。尝试使用'0.0'或'5.0',看看是否可以帮助你... –
也许[this](https://msdn.microsoft.com/en-us/library/aa261190%28v=vs.60%29。 aspx)将有助于:_“随后可通过调用_ _controlfp(EM_ZERODIVIDE,EM_ZERODIVIDE)”_ – DGibbs