Форум программистов, компьютерный форум, киберфорум
-=ЮрА=-
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  

Бесконечная точность при делении

Запись от -=ЮрА=- размещена 10.06.2012 в 10:31
Показов 5255 Комментарии 52

Решил раз и навсегда расставить точки над И в этом вопросе. Сразу скажу - те кто действительно хочет бесконечное число знаков - читаем пункт 2, для всех остальных же рекомендую прочесть данную статью сначала

1 - е Чтобы далеко в лес не ходить при достаточно большом количестве знаков после запятой можно использовать возможности форматированного вывода printf (либо std::setprecision)
К примеру нужно разделить 7 на 13 :
Вариант Си
Для вывода 15 знаков досточно вот такого спецификатора формата %.15f (не больше, цифры 17,20, 150 после точки дадут такой же результат что и 15)
Все желающие могут проверить код под тегом InfPrecisionC.
InfPrecisionC
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdio.h>
#include <stdlib.h>
 
int main()
{
    int M;//Числитель
    int N;//Знаменатель
    int K;//Число знаков после запятой
    char fmt[1027];//Предлагаю ограничиться точностью до 1024 знаков
    //всё равно максимум что получим - 15 знаков
    printf("\tPROGRAM FOR CALCULATION M/N\n");
    printf("INPUT   :\n");
    printf("Enter M : ");scanf("%d",&M);
    printf("Enter N : ");scanf("%d",&N);
    printf("Enter K : ");scanf("%d",&K);
    sprintf(fmt,"%%.%df\n",K);//Получаем требуемый нам спецификатор формата
    printf("ANSWER  : ");
    printf(fmt,1.0*M/N);
    system("pause");
    return 0;
}

Вариант С++
std::setprecision
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iomanip>
#include <iostream>
using namespace std;
 
int main()
{
    int M;//Числитель
    int N;//Знаменатель
    int K;//Число знаков после запятой
    cout<<"\tPROGRAM FOR CALCULATION M/N\n";
    cout<<"INPUT   :\n";
    cout<<"Enter M : ";cin>>M;
    cout<<"Enter N : ";cin>>N;
    cout<<"Enter K : ";cin>>K;
    cout<<"ANSWER  : "<<setprecision(K)<<1.0*M/N<<endl;
    system("pause");
    return 0;
}

2-е Ну а какже быть если нам реально надо бесконечая точностіь?Что ж у меня есть ответ и на этот вопросСмотрим код InfPrecisionCpp
InfPrecisionCpp
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
#include <string>
#include <iostream>
using namespace std;
 
int main()
{
    int i;//Счётчик
    int M;//Числитель
    int N;//Знаменатель
    int K;//Число знаков после запятой
    string result;//Будет содержать в себе
    //дробную часть (разряды после запятой)
    cout<<"\tPROGRAM FOR CALCULATION M/N\n";
    cout<<"INPUT   :\n";
    cout<<"Enter M : ";cin>>M;
    cout<<"Enter N : ";cin>>N;
    cout<<"Enter K : ";cin>>K;
    cout<<"ANSWER  : "<<M/N<<".";
    for(i = 0; i < K; i++)
    {
        M = M % N;
        M = M * 10;
        result += '0' + M/N;
    }
    cout<<result<<endl;
    system("pause");
    return 0;
}

Суть последнего алгоритма проста, постоянно получаем остаток целочисленного деления M на N множим на 10 и следующим разрядом будет результат целочисленного деления 10*(M % N) на N

Скриншоты работы прилагаю
Миниатюры
Нажмите на изображение для увеличения
Название: InfPrecisionC.JPG
Просмотров: 281
Размер:	26.5 Кб
ID:	759   Нажмите на изображение для увеличения
Название: InfPrecisionCpp.JPG
Просмотров: 294
Размер:	43.8 Кб
ID:	761  
Вложения
Тип файла: rar InfPrecisionC.exe.rar (21.8 Кб, 118 просмотров)
Тип файла: rar InfPrecisionCpp.exe.rar (46.3 Кб, 108 просмотров)
Размещено в Без категории
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 52
Комментарии
  1. Старый комментарий
    Аватар для Evg
    Тема называется "Бесконечная точность при делении", в то время как речь идёт о точности при печати. Я не знаю, понимаешь ли ты при этом, что деление отработает одинаково вне зависимости от того, сколько знаков ты попросишь напечатать. Так же не знаю, понимаешь ли ты то, что бесконечной точности в любом случае не будет, т.к. начиная с N'ого знака после запятой результат уже будет неверным из-за округлений. Причём округления выполняются в двоичной системе счисления, а потому константы типа 0.1 в принципе не могут быть представлены точно
    Запись от Evg размещена 10.06.2012 в 13:18 Evg вне форума
  2. Старый комментарий
    Аватар для -=ЮрА=-
    что деление отработает одинаково вне зависимости от того, сколько знаков ты попросишь напечатать
    - категорически не согласен. Во внутреннем представлении машины число будет ограничено максимальным числом разрядов после запятой отведенное под конкретный тип!Хочешь бесконечной точности - делай for(i = 0; true; ) и наслаждайся бесконечной точностью По поводу точности преставления - именно чаровский массив и позволяет хранить "довольно длинную колбасу после запятой" не парясь по поводу что в машинном представлении 0,1 = 0,09(9).
    Поэтому вникни в суть, а потом пиши даёт метод бесконечную точность или нет...
    Запись от -=ЮрА=- размещена 10.06.2012 в 13:58 -=ЮрА=- вне форума
  3. Старый комментарий
    Аватар для -=ЮрА=-
    Повторюсь : могу вывести хоть миллион хоть миллиард знаков после запятой, т.к. по хорошему вообще могу отказаться от хранения данных в контейнере, разновидностью которого является string, а делать вывод разрядов в файл. И будет файл 7/13 с миллиардом знаков после запятой
    Запись от -=ЮрА=- размещена 10.06.2012 в 14:02 -=ЮрА=- вне форума
  4. Старый комментарий
    Аватар для -=ЮрА=-
    т.к. начиная с N'ого знака после запятой результат уже будет неверным из-за округлений.
    - Вот скажи какой тебе знак нужен а я выведу сверху 2-3 (тысячи) знаков сверху
    Запись от -=ЮрА=- размещена 10.06.2012 в 14:06 -=ЮрА=- вне форума
  5. Старый комментарий
    [QUOTE]2-е Ну а какже быть если нам реально надо бесконечая точностіь?Что ж у меня есть ответ и на этот вопросСмотрим код InfPrecisionCpp
    InfPrecisionCpp
    Суть последнего алгоритма проста, постоянно получаем остаток целочисленного деления M на N множим на 10 и следующим разрядом будет результат целочисленного деления 10*(M % N) на N[/QUOTE]Бесконечности ты этим не добьёшся: для этого нужны:
    1. Бесконечное время.
    2. Бесконечная память.
    2.1. А для её поддержки адреса бесконечной разрядности, которые сожрут даже такую память.
    Запись от размещена 10.06.2012 в 14:15
  6. Старый комментарий
    Аватар для -=ЮрА=-
    Подумав решил выдать код специально для тебя Evg
    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
    38
    39
    40
    
    #include <fstream>
    #include <iostream>
    using namespace std;
     
    int main()
    {
        int M;//Числитель
        int N;//Знаменатель
        unsigned long i;//Счётчик
        unsigned long K;//Число знаков после запятой
        cout<<"\tPROGRAM FOR CALCULATION M/N\n";
        ofstream ofs("div.txt");//"div.txt" будет содержать в себе
        //дробную часть (разряды после запятой)
        char chr = '\0';
        cout<<"INPUT   :\n";
        cout<<"Enter M : ";cin>>M;
        cout<<"Enter N : ";cin>>N;
        cout<<"Enter K : ";cin>>K;
        cout<<"ANSWER  : "<<M/N<<".";
        if(!ofs.is_open())
            cerr<<"ERROR OPEN div.txt\n";
        else
        {
            ofs<<"ESPECIALLY FOR EVG\n";
            ofs<<M<<" / "<<N<<" = "<<M/N<<".";
        }
        for(i = 0; i < K; i++)
        {
            M = M % N;
            M = M * 10;
            chr = '0' + M/N;
            if(ofs.is_open())
                ofs<<chr;
            cout<<chr;
        }
        ofs.close();
        cout<<endl;
        system("pause");
        return 0;
    }
    Можешь на досуге сесть и сделать следующий ввод
    M = 7
    N = 13
    (можешь любые свои числа ввести)
    K = 10000000000
    Ждать конечно прийдётся долго, но как говориться искусство тербует жертв))
    Запись от -=ЮрА=- размещена 10.06.2012 в 14:18 -=ЮрА=- вне форума
  7. Старый комментарий
    Аватар для -=ЮрА=-
    taras atavin - код выше тебе, хотя не тебе его посвящалЗнаешь 10 млрд знаков после запятой позволяет мне говорить - бесконечная точность. Не вопрос есть супер компьютер введи туда 10 млрд*10 млрд и получи ответ
    Запись от -=ЮрА=- размещена 10.06.2012 в 14:20 -=ЮрА=- вне форума
  8. Старый комментарий
    Аватар для -=ЮрА=-
    Я хочу увидеть что нибудь конкретное - ошибку в логике или алгоритме, но не бабушкиных "а как это у железки 0,1 это 0,09(9)", "а как это памяти может не хватить", с кодом выше хватит и памяти лишь бы HDD позволил запихнуть файл div.txt да время нашлось столько сидеть у монитора в ожидании результата
    Запись от -=ЮрА=- размещена 10.06.2012 в 14:22 -=ЮрА=- вне форума
  9. Старый комментарий
    Аватар для -=ЮрА=-
    2.1. А для её поддержки адреса бесконечной разрядности, которые сожрут даже такую память.
    - кому я это писал
    по хорошему вообще могу отказаться от хранения данных в контейнере, разновидностью которого является string, а делать вывод разрядов в файл.
    - просто что было или чтобы читали а потом уж писали!
    Запись от -=ЮрА=- размещена 10.06.2012 в 14:24 -=ЮрА=- вне форума
  10. Старый комментарий
    [QUOTE]Знаешь 10 млрд знаков после запятой позволяет мне говорить - бесконечная точность. [/QUOTE]10 миддиардов - это счётное количество, а не бесконечность.
    Запись от размещена 10.06.2012 в 14:26
  11. Старый комментарий
    Если у тебя всего то 10 миллиардов (или триллионов, или даже гуглплексов) знаков, то так и пиши: высокая точность. Но не бесконечная.
    Запись от размещена 10.06.2012 в 14:28
  12. Старый комментарий
    Аватар для -=ЮрА=-
    taras atavin - чувак
    Хочешь бесконечной точности - делай for(i = 0; true; ) и наслаждайся бесконечной точностью
    - напиши программу - введи 7/13 и больше никогда в жизни не выключай машину. Во всём нашем мышлении есть предел, мы мыслим конечными категориями, никто не в силах представить бесконечную вселенную, либо кручение в пространтсве, бесконечную "жизнь" поля и т.д. Даже в расчётах атомного реактора или бомбы есть точность вычислений, она есть во всём если точность можно сделать настолько большого порядка что немыслимо представить то можно сказать "да чуваки это бесконечно точно".
    Запись от -=ЮрА=- размещена 10.06.2012 в 14:31 -=ЮрА=- вне форума
  13. Старый комментарий
    Можно себе представить даже (10^(10^100))^(10^(10^100)), то есть гуглплекс в степени гуглплекс знаков. Вообще всё, что конечно, в принципе представимо, надо только придумать компактный способ описать нужный порядок величины.
    Запись от размещена 10.06.2012 в 14:49
  14. Старый комментарий
    Аватар для -=ЮрА=-
    taras atavin, я уже сказал нужна бесконечная точность - включи програмку и больше никогда не выключай. Название темы менять не буду так как приведенный алгоритм может обеспечивать бесконечную точность, другое дело что программист ожидающий результат будет ждать его вечно, а в текущий момент сможет лишь увидеть на экране точность которую обеспечил алгоритм за годы беспрерывной работы. Подчёркиваю мне надоело толочь воду в ступе, всё написано!
    Запись от -=ЮрА=- размещена 10.06.2012 в 15:11 -=ЮрА=- вне форума
  15. Старый комментарий
    Аватар для Evg
    Цитата Сообщение от -=ЮрА=-
    Поэтому вникни в суть, а потом пиши даёт метод бесконечную точность или нет...
    Действительно, я не дочитал до конца, потому как после первого же примера читать перестал, ибо заведомо знал, что он неправильный. Так что часть своих претензий снимаю.

    Претензия по поводу названия темы остаётся. Эта якобы бесконечная точность есть только при печати, но не при вычислении, потому что реального вычисления числа нету. Да и то только при делении целых чисел. А потому возникает логичный вопрос: а нафига оно надо? Т.е. какая практическая польза этих действий? Вопрос задаю всвязи с тем, что ты "решил раз и навсегда расставить точки над И в этом вопросе", а потому хотелось бы понять, что за вопрос и зачем там надо расставлять точки?
    Запись от Evg размещена 10.06.2012 в 15:12 Evg вне форума
  16. Старый комментарий
    Аватар для Evg
    Цитата Сообщение от taras atavin
    Бесконечности ты этим не добьёшся: для этого нужны:
    ...
    2. Бесконечная память
    Бесконечная память не нужна, т.к. алгоритм очевидным образом использует конечное количество переменных (две штуки). Строковая переменная для накопления результата - это всего лишь элемент удобства. Можно сразу же делать печать после вычисления очередного десятичного знака, а потому бесконечной памяти не будет
    Запись от Evg размещена 10.06.2012 в 15:14 Evg вне форума
  17. Старый комментарий
    Аватар для -=ЮрА=-
    Ещё раз увижу записи типа
    10 миддиардов - это счётное количество, а не бесконечность.
    буду их изымать как флуд
    Всем кому нужна бесконечная точность идут сюда
    https://www.cyberforum.ru/blog... omment2689 и делают цикл бесконечным, а также исключают инкрементирование счётчика дабы избежать превышения максимального значения unsigned long. Включив программу больше никогда её не выключайте и да прибудет с вами сила, многотеррабайтный HDD и бесконечная жизнь!
    Запись от -=ЮрА=- размещена 10.06.2012 в 15:15 -=ЮрА=- вне форума
  18. Старый комментарий
    Аватар для -=ЮрА=-
    ибо заведомо знал, что он неправильный.
    - читай пост выше. Свой ответ приурачивал данной теме, верней ответу на конкретный вопрос .
    Запись от -=ЮрА=- размещена 10.06.2012 в 15:20 -=ЮрА=- вне форума
  19. Старый комментарий
    Аватар для -=ЮрА=-
    Вопрос задаю всвязи с тем, что ты "решил раз и навсегда расставить точки над И в этом вопросе", а потому хотелось бы понять, что за вопрос и зачем там надо расставлять точки?
    Потому как за почти 4-ри года своего присутсвия здесь на форуме, вразумительного ответа на тему вывода любого заданного числа знаков после запятой так и не встретил, данная тема может служить довольно неплохим подспорьем начинающему в понимании а как же вывести 25 значущих разрядов после запятой!
    Запись от -=ЮрА=- размещена 10.06.2012 в 15:22 -=ЮрА=- вне форума
  20. Старый комментарий
    Аватар для Evg
    Цитата Сообщение от -=ЮрА=-
    Свой ответ приурачивал данной теме, верней ответу на конкретный вопрос .
    Первые два примера действительно относятся к этой теме: печать числа с заданной точностью. Однако твоя статья в первую очередь посвящена третьему примеру: печать дроби с произвольной точностью. И вопрос у меня был такой: зачем это нужно. Потому как кроме того, чтобы что-то напечатать на экран, этот алгоритм, на первый взгляд, не умеет делать ничего другого полезного
    Запись от Evg размещена 10.06.2012 в 15:24 Evg вне форума
 
Новые блоги и статьи
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Video: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru