2016-11-22 1 views
-1

Учитывая, что числа относительно малы (от -1 до ~ 1) и являются поплавками и генерируются случайным образом, можете ли вы получить «недействительную операцию с плавающей запятой», добавив слишком много из них? Я спрашиваю, потому что это то, что, очевидно, происходит в моей программе прямо сейчас и очень редко. Кроме того, как отключить (или избежать) исключение?Может ли слишком много добавлений поплавков вызывать «недействительную операцию с плавающей запятой»?

На всякий случай, мой компилятор - gcc (i686-posix-dwarf-rev0, построенный проектом MinGW-W64). 5.1.0.

EDIT В соответствии с просьбой я предоставляю код. Однако добавление поплавков, вызывающих ошибку, является только моей гипотезой, вот почему я пришел сюда, чтобы узнать, может ли это быть моей проблемой. Если я запускаю код ниже, разумно ли, что я могу получить ошибку?

#include <iostream> 

int main() 
{ 
    float sum = 0, add = 0; 
    while (true) 
    { 
     add = static_cast <float> (rand())/static_cast <float> (RAND_MAX); 
     if (rand() % 2) add *= -1; 
     sum += add; 
    } 
} 

EDIT 2: Я не получаю сообщение об ошибке с кодом выше, мне просто нужно знать, если это могло произойти.

+5

Можете ли вы показать [mcve]? – mindriot

+0

'rand()' плохо. –

+0

Вы действительно получили сообщение об ошибке с опубликованным кодом? –

ответ

1

Стандарт IEEE 754 определяет следующие ситуации, в которых «недопустимая операция» имеет место с плавающей точкой исключение:

  • работает на сигнализации NaN
  • умножения 0 × ∞ или ∞ × 0
  • добавления/вычитание бесконечностей, таких как ∞ -∞, -∞ + ∞ и т. д.
  • деление 0/0 или ∞/∞
  • вычисление остатка x/y при y = 0 или x = ∞, и ни одно из них не является NaN
  • извлечения квадратного корня из отрицательного числа
  • Quantize, если результат не помещается в формате назначения или когда один из операндов имеет конечное, а другой является бесконечным
  • преобразования NaN, ∞ или внеконкурсных целевой диапазон с плавающей точкой в ​​целое число
  • сравнения неупорядоченных значений с плавающей точкой с сигнализацией
  • вычисления целого логарифма NaN, ∞ или 0

Ваш примером кода не будет вызывать какую-либо из этих случаев, так профессионал blem будет в другом месте вашего кода.

+0

Отличный ответ, спасибо! – user3496846

Смежные вопросы