当算术运算溢出时,它们会产生一个确定性的数字
When arithmetic operations overflow do they result in a deterministic figure?
给定相同的两个输入和一个会导致溢出的算术运算,溢出的结果总是相同的吗?
只是为了背景,我正在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
相关文章:
- 如何(从固定列表中)选择一个数字序列,该序列将与目标数字相加
- 如何获取一个数字的前3位
- 以C++输出一个数字三角形
- 反转一个数字程序不起作用,为什么?
- 如何让用户在 c++ 中选择一个数字
- 输出一个数字,该数字可能是三种类型之一
- C++在不使用pow或循环的情况下计算一个数字的幂
- 我必须更改我的数字最后一个数字和第一个数字,但不要使用仅带有整数或循环的函数.例如从 12345 到 52341
- 找到所有与自己求和的数字X的快速方法,去掉一个数字得到N
- C++[递归]将一个数字写成2的升序之和
- 试图找到一个数字的平方根,但代码不起作用。C++
- 我没有得到一个数字作为输出,而是一个表情符号
- 我的代码应该接受一个数字,并返回字母等级或"Grade is not valid"但 else 语句不起作用
- 将一个数字拆分为多个数字,每个数字只有一个有效位
- 你怎么编码,如果x不等于一个数字,程序就会退出
- 如何将整数数组相乘得到一个数字?
- 为无符号字符* 分配一个数字
- 如何以更有效的方式检查一个数字是否是素数?
- C++显示两个区间之间的数字的程序检查一个数字是否可以表示为两个素数的总和
- 字符串和双精度的麻烦,等值后再得到一个数字