Злые модули
Есть такая засада в 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 и использованию его в качестве результата.
Комментариев нет:
Отправить комментарий