Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.79/34: Рейтинг темы: голосов - 34, средняя оценка - 4.79
0 / 0 / 0
Регистрация: 29.11.2015
Сообщений: 19

Точность вычислений у double

29.11.2015, 11:43. Показов 7366. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Дана задача: "Определить, на сколько нулей заканчивается факториал числа n". Пример: вводим "25", на выходе должны получить "6" (25! = 15511210043330985984000000). Написал программку. Но столкнулся с тем, что при подсчете факториала точность вычислений достигает 16-ти знаков. Это приводит к тому, что 25! = 1.5511210043330986e+025 = 1.5511210043330986000000000 (9 нулей). Соответственно, результатом отработки программы будет 9, а не 6. Как можно увеличить точность вычисления?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include "stdafx.h"
#include <iostream>
#include <math.h>
 
 
using namespace std;
 
double factorial(double n)
{
    double ans = 1;
    for (double i = 1.0; i <= n; i++)
        ans *= i;
    return ans;
}
 
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(LC_ALL, "Russian");
    double n = 0, fact_n, celchast, ostatok = 1;
    cout << "Введите число: ";
    cin >> n;
    fact_n = factorial(n);
    cout << fact_n << endl;
    int i = 0;
    do
    {
        fact_n /= 10;
        ostatok = modf(fact_n, &celchast);
        if (ostatok == 0)
            i++;
    } while (ostatok == 0);
    
    cout << "Колличество нулей в факториале: " << i << endl;
 
    system("Pause");
    return 0;
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
29.11.2015, 11:43
Ответы с готовыми решениями:

Точность вычислений в double (Обрезание числа)
Здравствуйте! Дело в том, что мне необходимо выводить большие числа с большим количеством знаков после запятой. Однако и double и float...

Точность вычислений
Для проверки точности вычислений существуют формулы и калькулятор на 200000 знаков до и после запятой. Проверяются любые вычисленные...

Высокая точность вычислений (погрешность<10^-30)
Здравствуйте, необходимо вычислить значение функции с заданной точностью (к примеру с точностью до 30-го знака после запятой), знает ли кто...

8
56 / 54 / 33
Регистрация: 05.11.2014
Сообщений: 259
29.11.2015, 11:48
Для выполнения подобной задачи придется писать обработку больших чисел через массив чисел.
Хотя мне кажется, что в вашем случае есть решение проще. К примеру, посчитать количество 10-ток (а также 2-ек и 5-рок), участвующих в вычислениях. Нужно подумать немного над хитрым решением.
1
Эксперт С++
1675 / 1047 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
29.11.2015, 11:51
В число типа double влезает 15-16 значащих цифр. Это раз. Для данной задачи нет необходимости вычислять сам факториал, это два. Достаточно подсчитать количество входящих в него множителей, кратных 5 - это и будет ответ. Наверняка подсчёт кратных 5 чисел на промежутке от 1 до n не такое уж трудное дело.
1
Модератор
Эксперт С++
 Аватар для zss
13773 / 10966 / 6491
Регистрация: 18.12.2011
Сообщений: 29,244
29.11.2015, 11:52
PavelPol, и не только десяток (2*5=10)
Можно, например, считать нули по мере их появления в произведении и каждый раз делить результат на 10.
0
56 / 54 / 33
Регистрация: 05.11.2014
Сообщений: 259
29.11.2015, 11:56
Цитата Сообщение от zss Посмотреть сообщение
PavelPol, и не только десяток (2*5=10)
Да, я это сразу исправил)
0
0 / 0 / 0
Регистрация: 29.11.2015
Сообщений: 19
29.11.2015, 13:08  [ТС]
Цитата Сообщение от Nick Alte Посмотреть сообщение
Достаточно подсчитать количество входящих в него множителей, кратных 5
Это работает, но только до 24!. Если рассмотреть таблицу факториалов, то видно, что количество нулей в конце факториала зависит от количества множителей, кратных 5.

1! = 1
2! = 2
3! = 6
4! = 24
5! = 120
6! = 720
7! = 5040
8! = 40320
9! = 362880
10! = 3628800
11! = 39916800
12! = 479001600
13! = 6227020800
14! = 87178291200
15! = 1307674368000
16! = 20922789888000
17! = 355687428096000
18! = 6402373705728000
19! = 121645100408832000
20! = 2432902008176640000
21! = 51090942171709440000
22! = 1124000727777607680000
23! = 25852016738884976640000
24! = 620448401733239439360000
25! = 15511210043330985984000000

при n=4 нулей в конце факториала нет,
при n=9 кол-во нулей = 1, (множитель, кратный 5, всего 1, это "5")
при n=14 кол-во нулей =2, (два кратных множителя: 5 и 10)
при n=19 кол-во нулей =3, (три кратных множителя: 5, 10, 15)
при n=24 кол-во нулей =4, (четыре....: 5, 10, 15, 20)
а вот при n=25 количество нулей увеличивается сразу на 2 и становится равным 6, хотя множителей, кратных 5, всего пять (5, 10, 15, 20, 25)

Или я что-то не учел в подсчетах?
0
Эксперт по математике/физике
4182 / 3052 / 918
Регистрация: 19.11.2012
Сообщений: 6,196
29.11.2015, 13:14
Цитата Сообщение от geniuss7 Посмотреть сообщение
Или я что-то не учел в подсчетах?
Не учел. Надо подсчитывать не число множителей, кратных 5, а степень пятерки, в которой она входит во все эти множители и их складывать.
1
0 / 0 / 0
Регистрация: 29.11.2015
Сообщений: 19
29.11.2015, 13:19  [ТС]
Цитата Сообщение от kabenyuk Посмотреть сообщение
степень пятерки, в которой она входит во все эти множители
Все получилось!

Всем огромнейшее спасибо!))))))
0
techpriest
 Аватар для Mirmik
634 / 213 / 57
Регистрация: 27.02.2014
Сообщений: 1,180
29.11.2015, 13:21
А можно использовать тип int128... Но, его сперва надо подключить в систему, т.к. скорее всего компилятор его не узнает.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
29.11.2015, 13:21
Помогаю со студенческими работами здесь

Вещественные числа с плавающей точкой, точность вычислений
Работаю над проектом, требующим большую точность вычисления вещественных чисел. Решила использовать long double в надежде получить...

Точность в double
Добрый день Мне задали сделать проект в универе - Калькулятор с великой точностю. Я уже почти его сделал, но у меня возникла...

Точность типа double
Всем привет! У меня такой код,точность как видите страдает,так как мне нужно с точностью до 20 знака #include&lt;iostream&gt; ...

Точность.Тип double
Вопрос такой. Пишу программу, в которой имеется цикл: double t=0, dt = 0.000001; t = t + dt; cout &lt;&lt; &quot;t --&gt;...

Double сокращение с точность до N знаков - C/C++
Хочу написать программу сокращающую число знаков после запятой на какое-то определённое количество заданное с клавиатуры (n). Пробовал...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru