Этот фрагмент кода является просто поиском количества цифр, необходимых для «самого длинного» целого числа;это, вероятно, необходимо для того, чтобы выделить какой-нибудь буфер позже.
log10
дает вам степень десяти, соответствующую его аргументу, которая округляется до следующего целого числа (отсюда +1
, за которым следует приведение (int)
, что приводит к усечению), дает количество цифр, необходимое для числа.
Аргумент log10
- беспорядок, так как abs
вызывается дважды, когда достаточно одного раза.Тем не менее, идея состоит в том, чтобы передать log10
абсолютное значение проверяемого числа, если оно не равно нулю, или 1, если оно равно нулю - это потому, что если бы аргумент был равен нулю, логарифм отклонился бы до минус бесконечности (чтонежелательно в этом случае, я думаю, что преобразование в int
приведет к странным результатам).
Остальная часть цикла - это просто поиск максимума: на каждой итерации он вычисляет цифры, необходимые длятекущий проверяемый int проверяет, больше ли он «текущего максимума» (d
), и, если это так, заменяет «текущий максимум».
d+=1
может использоваться в целях предосторожности(?) или для нулевого терминатора выделяемой строки, это зависит от того, как впоследствии используется d
.
Что касается ошибки «неоднозначный вызов»: вы получаете ее, потому что звоните log10
с аргументом int
, который может быть одинаково преобразован в float
, double
и long double
(все типы, для которых log10
перегружен), поэтому перегрузка для выбора не яснаo компилятор.Просто вставьте (double)
приведение перед всем аргументом log10
.
Кстати, этот код можно было бы упростить / оптимизировать, просто посмотрев максимальное значение int
(в абсолютном значении) и , а затем , взяв логарифм по основанию-10 для определения необходимого количества цифр..