Когда переполнение арифметических операций приводит к детерминированной фигуре?

При тех же двух входах и арифметической операции, которая приведет к переполнению, результат переполнения всегда будет одинаковым?

Просто для фона, я работаю в проекте Visual Studio C ++ с некоторыми причудливыми маленькими числами с плавающей запятой, пришедшими от некоторых гауссианов, передаваемых из Matlab через calllib, которые дают мне то, что выглядит как переполнение, когда показатель степени переходит к огромным числам в определенных местах эта матрица. Проблема в том, что когда я перезапускаю свой код, я все еще получаю переполнения, но в разных местах, что заставляет меня задуматься, насколько стабильно и детерминировано поведение переполнения.

0

Решение

Переполнение целых чисел со знаком неопределенное поведение; может случиться что угодно, даже такие вещи, как сбой вашей программы.

С практической точки зрения, когда компилятор создал вашу программу, он, вероятно, принял решение о некотором детерминированном поведении …

… однако, что вам действительно нужно беспокоиться, так это то, что компилятор определит некоторые Другой детерминированное поведение, если вы редактируете свою программу и компилируете ее снова, или вы изменяете параметры сборки и компилируете ее снова, или если вы обновляетесь до более новой версии и компилируете ее снова, или если вы пытаетесь использовать другой компилятор, или вы используете тот же функционировать в двух разных местах, и он решает выбрать различное поведение для каждого, и так далее.

1

Другие решения

Не могу ответить на это исчерпывающе, но подумал, что я продемонстрирую небольшой пример, который я сделал.
Итак, вот игрушечный пример, приготовленный в 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:\Users\me>cd/d C:\Users\me\Documents\Visual Studio 2010\Projects\TestSolution\Debug

C:\Users\me\Documents\Visual Studio 2010\Projects\TestSolution\Debug>TestSolution.exe
a=2147483647
b=a+10=-2147483639
d1=1.79769e+308
d2=2*d2=1.#INF

C:\Users\me\Documents\Visual Studio 2010\Projects\TestSolution\Debug>TestSolution.exe
a=2147483647
b=a+10=-2147483639
d1=1.79769e+308
d2=2*d2=1.#INF

C:\Users\me\Documents\Visual Studio 2010\Projects\TestSolution\Debug>TestSolution.exe
a=2147483647
b=a+10=-2147483639
d1=1.79769e+308
d2=2*d2=1.#INF

C:\Users\me\Documents\Visual Studio 2010\Projects\TestSolution\Debug>TestSolution.exe
a=2147483647
b=a+10=-2147483639
d1=1.79769e+308
d2=2*d2=1.#INF
0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector