English 中文(简体)
C++/CLI: SIGFPE, _ Control87, _fpreset, Porting original un management Watcom C app to . NET
原标题:C++/CLI: SIGFPE, _control87, _fpreset, porting ancient unmanaged Watcom C app to .NET

我有几条硬线应用,依靠SIGFPE(由一个职能点人接手发出信号,以改变状态,并在出现某些浮动点条件时正确操作。 然而,根据C++/CLI在管理下,_ Control87产生了一个系统。 C._fpreset和_ Control87中写成的静态平衡中的抗震执行没有得到支持。

我如何在C++/CLI应用中找到传统的、未经管理的SIGFPE行动? 在我的申请中,出现浮点的障碍的地点数目可能很大,我不完全理解其他方案者几年前提出的所有数字方法。

我想,处理流动点划分工作的旧学校例外是零,而不是中值。 平台援引体字体为t work,而“ppragma”管理(off)则不是trick。

我有什么选择?

问题回答

这里有几个非常严重的痛苦点。 有利的浮动点例外与有管理的编码执行严重不符。 从基本面来看,你很容易坠毁JIT-公司。 当你使用——控制87(a)时,你会遇到什么问题。

是的,如果执行原住民法典,你就有一个例外。 只有在提出例外规定时,才发出信号手,而且没有守则可以处理。 不可避免的是,在C经营时间图书馆能够看到这一例外情况之前,《刑法》委员会就看到这一例外。 因此,你从来没有听过SIGFPE手稿。

朝此方向射击的唯一适当方式是写上一部在《刑法》生效之前可以赶上例外情况的包裹。 同样非常重要的是,你必须仔细管理万国邮联控制字,你只能负担在本地法典实施期间允许万国邮联例外。 这需要一刀阔.的美术,即,你们不会享受到很多东西。

你们没有把任何刀子放下,因此,我不得不举一个sil的例子:

#include <Windows.h>
#include <signal.h>
#include <float.h>

#pragma managed(push, off)

double divisor;

void __cdecl fpehandler(int sig) {
    divisor = 1.0;
}

double badmath() {
    divisor = 0.0;
    return 1 / divisor;
}
#pragma managed(pop)

为了获得假肢,你需要在C跑道图书馆内打电话给例外手。 很幸运的是,它暴露了,你可以把它联系起来。

// Exception filter in the CRT, it raises the signal
extern "C" int __cdecl _XcptFilter(unsigned long xcptnum, 
                                   PEXCEPTION_POINTERS pxcptinfoptrs);

你们需要确保,它只是要求有点例外。 因此,我们需要一个关注例外法的总结:

int FloatingpointExceptionFilter(unsigned long xcptnum, PEXCEPTION_POINTERS pxcptinfoptrs) {
    // Only pass floating point exceptions to the CRT
    switch (xcptnum) {
        case STATUS_FLOAT_DIVIDE_BY_ZERO:
        case STATUS_FLOAT_INVALID_OPERATION:
        case STATUS_FLOAT_OVERFLOW:
        case STATUS_FLOAT_UNDERFLOW:
        case STATUS_FLOAT_DENORMAL_OPERAND:
        case STATUS_FLOAT_INEXACT_RESULT:
        case STATUS_FLOAT_STACK_CHECK:
        case STATUS_FLOAT_MULTIPLE_TRAPS:
        case STATUS_FLOAT_MULTIPLE_FAULTS:
            return _XcptFilter(xcptnum, pxcptinfoptrs);
            break;
        default:
            return EXCEPTION_CONTINUE_SEARCH;
    }
}

现在,你可以写出一张有信号手叫来的不算术的包裹:

double badmathWrapper() {
    __try {
        return badmath();
    }
    __except (FloatingpointExceptionFilter(GetExceptionCode(), GetExceptionInformation())) {
    }
}

而这又可由你从任何管理守则中呼吁的C++/CLI级。 它需要确保在发出呼吁之前允许浮动点例外,并在发出呼吁后再次恢复:

using namespace System;
using namespace System::Runtime::CompilerServices;

public ref class Wrapper {
public:
    static double example();
};

[MethodImplAttribute(MethodImplOptions::NoInlining)]
double Wrapper::example() {
    signal(SIGFPE, fpehandler);
    _clear87();
    unsigned oldcw = _control87(_EM_INEXACT, _MCW_EM);
    try {
        return badmathWrapper();
    }
    finally {
        _control87(oldcw, _MCW_EM);
        signal(SIGFPE, nullptr);
    }
}

注意到要求——控制87(a),它使除“实际结果”外的所有浮动例外成为可能。 这样做是必要的,才能使法典被搁置。 如果你不戴面罩,那么《刑法》就死去了骇人听闻的死伤,在该网站的名称被终止之前,再一次将例外情况搁置。 希望你的信号手确实需要。





相关问题
Haskell minimum/maximum Double Constant

Is there any way in Haskell to get the constant that is the largest and smallest possible positive rational number greater than zero that can be represented by doubles?

integer automatically converting to double but not float

I have a function like below: void add(int&,float&,float&); and when I call: add(1,30,30) it does not compile. add(1,30.0,30.0) also does not compile. It seems that in both cases, it ...

Lower Bounds For Floating Points

Are there any lower bounds for floating point types in C? Like there are lower bounds for integral types (int being at least 16 bits)?

Floating point again

Yesterday I asked a floating point question, and I have another one. I am doing some computations where I use the results of the math.h (C language) sine, cosine and tangent functions. One of the ...

热门标签