当算术运算溢出时,它们会产生一个确定性的数字

When arithmetic operations overflow do they result in a deterministic figure?

本文关键字:一个 数字 确定性 溢出 算术运算      更新时间:2023-10-16

给定相同的两个输入和一个会导致溢出的算术运算,溢出的结果总是相同的吗?

只是为了背景,我正在Visual Studio c++项目中工作,其中一些时髦的小浮点数来自一些高斯数字,通过calllib从Matlab传递过来,这给了我什么是溢出,指数在这个矩阵的某些地方跳跃到巨大的数字。问题是当我重新运行我的代码时,我仍然得到溢出,但是在不同的地方,这让我想知道溢出行为是多么稳定和确定性。

有符号整数溢出未定义行为;任何事情都有可能发生,甚至像你的程序崩溃这样的事情。

作为一个实际问题,当编译器构建你的程序时,它可能决定了一些确定性的行为…

…但是,你真的需要担心的是,编译器将决定其他确定性行为如果再次编辑程序并编译它,或者你改变构建选项和编译一遍,或者如果你升级到新版本和编译一遍,或者如果你尝试使用不同的编译器,或者你使用相同的函数在两个不同的地方,它决定为每一个选择一个不同的行为,等等。

不能详尽地回答这个问题,但我想我可以演示一下我做的小例子。下面是在Visual Studio 2010中编写的示例

#include <climits>
#include <cfloat>
int _tmain( int argc , _TCHAR* argv[] )
{
    // IS OVERFLOW DETERMINISTIC
    int a = INT_MAX;
    int b = a + 10;
    std::cout <<"a="    << a << std::endl;
    std::cout <<"b=a+1="<< b << std::endl;
    double d1 = DBL_MAX ;
    double d2 = 2*d1;
    std::cout <<"d1="     << d1 << std::endl;
    std::cout <<"d2=2*d2="<< d2 << std::endl;
    return 0;
}

这里有一些对应用程序的调用…

C:Usersme>cd/d C:UsersmeDocumentsVisual Studio 2010ProjectsTestSolutionDebug
C:UsersmeDocumentsVisual Studio 2010ProjectsTestSolutionDebug>TestSolution.exe
a=2147483647
b=a+10=-2147483639
d1=1.79769e+308
d2=2*d2=1.#INF
C:UsersmeDocumentsVisual Studio 2010ProjectsTestSolutionDebug>TestSolution.exe
a=2147483647
b=a+10=-2147483639
d1=1.79769e+308
d2=2*d2=1.#INF
C:UsersmeDocumentsVisual Studio 2010ProjectsTestSolutionDebug>TestSolution.exe
a=2147483647
b=a+10=-2147483639
d1=1.79769e+308
d2=2*d2=1.#INF
C:UsersmeDocumentsVisual Studio 2010ProjectsTestSolutionDebug>TestSolution.exe
a=2147483647
b=a+10=-2147483639
d1=1.79769e+308
d2=2*d2=1.#INF