C/C++

Задача на C++

Как найти кол-во значащих знаков действительного числа после запятой без использования строк, ветвлений, циклов и рекурсий? (При R>1)
Гриф Хайруллин
Гриф Хайруллин
16 653
Для нахождения количества значащих знаков действительного числа после запятой, без использования строк, ветвлений, циклов и рекурсий, вы можете воспользоваться математическими операциями. В C++, вы можете использовать следующий код:
#include <iostream>
#include <cmath>

int main() {
double num = 123.456789; // Замените это число на нужное
double fractionalPart = num - floor(num);
int precision = 0;

while (fractionalPart != floor(fractionalPart) && precision < 15) {
fractionalPart *= 10;
precision++;
}

std::cout << "Количество значащих знаков после запятой: " << precision << std::endl;

return 0;
}


В этом коде мы сначала вычитаем целую часть числа, чтобы оставить только дробную часть. Затем мы умножаем дробную часть на 10 до тех пор, пока она не станет целым числом (значащая цифра), и увеличиваем счетчик precision. Когда дробная часть становится целой, мы завершаем цикл, и precision будет содержать количество значащих знаков после запятой.

Пожалуйста, учтите, что этот код предполагает, что число num больше 1 (R>1), и в коде используется значение по умолчанию 15 для максимальной точности, но вы можете изменить это значение по вашему усмотрению.
Mb Uu
Mb Uu
709
Лучший ответ
Если R > 1, то можно использовать логарифмы для нахождения количества значащих знаков действительного числа после запятой.

Количество значащих знаков после запятой можно найти следующим образом:
1. Возьмите логарифм по основанию R от данного числа.
2. Округлите полученное значение вниз до ближайшего целого числа.
3. Вычтите из округленного значения логарифма количество целых чисел (до запятой в исходном числе).
4. Результат будет являться количеством значащих знаков после запятой.

Например, для числа 37.578 и основания R = 10:
1. Логарифм числа 37.578 по основанию 10: log10(37.578) ≈ 1.574.
2. Округление вниз: floor(1.574) = 1.
3. Вычитание количества целых чисел: 1 - 2 (2 целых числа до запятой) = -1.
4. Результат: 1 (количество значащих знаков после запятой).

Таким образом, получили, что у числа 37.578 есть 1 значащий знак после запятой.
SA
Sky Angel
2 007
cpp
#include <iostream>
#include <cmath>
int main() {
double x = 3.141592653589793;
int exp;
double mantissa = std::frexp(x, &exp);
int significant_digits = std::numeric_limits<double>::digits - 1 - exp;
std::cout << "Number of significant digits: " << significant_digits << std::endl;
return 0;
}
Максим Скворцов О май гад...
О, май, гад...
Гриф Хайруллин Либо данный код не выводит то, что нужно, либо я не знаю в чём проблема, если вы считаете его верным
Гриф Хайруллин Та же переменная mantissa нигде не участвует