log10(long long int)
не определено. Затем num2
неявно преобразуется в double
, что имеет меньшую точность. Преобразование num2
в long double
решает проблему.
Этот обходной путь не работает с Visual Studio (там double = long double). Однако он работает с g cc и clang.
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
long long num1 = 1999999999999999;
long long num2 = 9999999999999999;
long double x = static_cast<long double> (num2);
int number_of_digit_1 = log10(num1) + 1;
int number_of_digit_2 = log10(num2) + 1;
int number_of_digit_3 = log10(x) + 1;
cout << number_of_digit_1 << endl;
cout << number_of_digit_2 << endl;
cout << number_of_digit_3 << endl;
}
Другая возможность - использовать простую специальную функцию для вычисления количества цифр с простым while
l oop. Как правило, в такой ситуации не стоит беспокоиться о высоком КПД.
template <typename T>
int n_digits (T num) {
int n = 0;
while (num != 0) {
++n;
num /= 10;
}
return n;
}