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?

+0

如果你實際上只是在你的測試中使用了浮點類型,你不會需要任何這個容易出錯的遺留垃圾。嘗試一下。 – leppie

+1

我期望'controlfp'來控制*浮點操作 - 你正在執行整數操作。嘗試使用'0.0'或'5.0',看看是否可以幫助你... –

+1

也許[this](https://msdn.microsoft.com/en-us/library/aa261190%28v=vs.60%29。 aspx)將有助於:_「隨後可通過調用_ _controlfp(EM_ZERODIVIDE,EM_ZERODIVIDE)」_ – DGibbs

回答

0
int a = 0; 
var b = 5/a; 

您正在執行整數運算,因此屏蔽浮點異常對此表達式沒有影響。

相關問題