вторник, 17 февраля 2009 г.

Злые модули

Есть такая засада в C++, Java и, вероятно, в некоторых других языках. Функции, вычисляющие модуль целого числа (std::abs в С++ или Math.abs в Java), способны возвращать отрицательные значения!

Например, число типа long имеет максимальное значение 2147483647, а минимальное — -2147483648. Соответственно, модуль минимального числа типа long не может быть представлен типом long — функция просто молча вернёт переданное в неё отрицательное значение.


cout << "min = " << numeric_limits::min() << " ; max = " <<
numeric_limits::max() << endl;
cout << "abs(min) = " << abs(numeric_limits::min());

Вывод:

min = -2147483648 ; max = 2147483647
abs(min) = -2147483648

На это можно однажды крепко налететь...

В SmallTalk, к слову, такой проблемы нет. Т.к. ему вообще не свойственна проблема переполнения целых чисел. LargePositiveInteger, имеет неограниченый размер. А операции над ограниченным по размеру SmallInteger, при необходимости автоматически приведут к созданию LargePositiveInteger и использованию его в качестве результата.

Комментариев нет: