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

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

Запись от -=ЮрА=- размещена 10.06.2012 в 10:31
Показов 5313 Комментарии 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
    Цитата Сообщение от -=ЮрА=-
    Потому как за почти 4-ри года своего присутсвия здесь на форуме, вразумительного ответа на тему вывода любого заданного числа знаков после запятой так и не встретил, данная тема может служить довольно неплохим подспорьем начинающему в понимании а как же вывести 25 значущих разрядов после запятой!
    Если речь идёт о твоих первых двух примеров, то я, хоть и нечасто читаю форум, много раз видел ответы на этот вопрос. И, повторюсь, твоя статья называется "бесконечная точность при делении", а не "печать плавающих чисел с заданной точностью".

    Мне кажется, что твою статью надо разделить на две. Печать на Си и на Си++ - в одну статью, всё остальное - в другую. Неплохо было бы не полениться и к обеим статьям написать нормальное сопроводительное пояснение, чтобы понятно было, какова постановка задачи. Потому как по поводу деления я постановки задачи так и не понял с практической точки зрения
    Запись от Evg размещена 10.06.2012 в 15:27 Evg вне форума
  2. Старый комментарий
    Аватар для -=ЮрА=-
    Evg , ну почему упорно игнорируете с taras_attavin тот факт что данный алгоритм может отрабатывать сколь угодно долго и обеспечивать абсолютно любую заданную точность???Немного позже введу в код поддержку деления double на double думаю уже тогда все вопросы об утилитарности данной темы отпадут сами собой.
    Запись от -=ЮрА=- размещена 10.06.2012 в 15:37 -=ЮрА=- вне форума
  3. Старый комментарий
    [QUOTE]Бесконечная память не нужна, т.к. алгоритм очевидным образом использует конечное количество переменных (две штуки).[/QUOTE]И где хранить результат? На винте? Винт - часть долговременной [B]памяти[/B]. На другом диске? Это внешняя долговременная [B]память[/B]. Экран забивает? Вспоминаем термин "видео[B]память[/B]". Частное где то должно валяться целиком, иначе у тебя не бесконечное число знаков после запятой, а бесконечный знак после неё же. Да и то задолго после тепловой смерти вселенной.
    Запись от размещена 10.06.2012 в 15:37
  4. Старый комментарий
    Аватар для Evg
    Цитата Сообщение от -=ЮрА=-
    Evg , ну почему упорно игнорируете с taras_attavin тот факт что данный алгоритм может отрабатывать сколь угодно долго и обеспечивать абсолютно любую заданную точность???
    Я не игнорирую очевидных вещей (ибо не имею такой привычки). Я могу написать бесконечный цикл и утверждать, что он может работать бесконечно долго и дескать, товарищи, не игнорируйте этот факт. Но практической пользы от этого бесконечного цикла нет. Точно так же на прямой вопрос "зачем это нужно" ты так и не дал прямого ответа

    Цитата Сообщение от -=ЮрА=-
    Немного позже введу в код поддержку деления double на double думаю уже тогда все вопросы об утилитарности данной темы отпадут сами собой.
    А смысл-то в этом какой? double у тебя изначально представляется не точно. Кроме случаев, когда число можно разложить в законченный ряд по отрицательным степеням двойки (что не имеет статистически значимого влияния на множество чисел, используемый в реальных задачах). В чём смысл делить два изначально неточных числа и напечатать результат с бесконечной точностью (который начиная с N'го знака будет неверным)? И опять-таки мы упираемся в то, что ты можешь что-то напечатать на экран. А кому и зачем это надо?
    Запись от Evg размещена 10.06.2012 в 15:45 Evg вне форума
  5. Старый комментарий
    Аватар для -=ЮрА=-
    где хранить результат? На винте? Винт - часть долговременной памяти. На другом диске? Это внешняя долговременная память.
    - Убери запись в файл и сиди всю жизнь запоминай числа, тогда HDD не нужен будет.
    Экран забивает? Вспоминаем термин "видеопамять". Частное где то должно валяться целиком, иначе у тебя не бесконечное число знаков после запятой, а бесконечный знак после неё же. Да и то задолго после тепловой смерти вселенной.
    - Какая чёрт возьми видеопамять?!!!Консоль по максимуму имеет 999 строк в 999 буферах- всё большее количество символов просто не отображается
    Запись от -=ЮрА=- размещена 10.06.2012 в 15:50 -=ЮрА=- вне форума
  6. Старый комментарий
    Аватар для -=ЮрА=-
    Точно так же на прямой вопрос "зачем это нужно" ты так и не дал прямого ответа
    - Можно рассчитывать с любой заданной точность результат деления двух чисел! Когда доведу алгоритм он будет вот также и с даблами работать. Полученные результаты могут быть использованы при построении специализированных вычислительных алгоритмов практически без потерь точности, которые могут использоваться для вычисления интервала энергий бозона Хигса, расчёте длинны с точностью до микрон от центра галактики до центра вселенной, звезды, "до центра васи пупкина на унитазе". Где угодно можно использовать!!!
    Запись от -=ЮрА=- размещена 10.06.2012 в 15:53 -=ЮрА=- вне форума
  7. Старый комментарий
    Аватар для -=ЮрА=-
    А смысл-то в этом какой? double у тебя изначально представляется не точно.
    - ха вот и приехали, так в том и фишка была что дабл можно представить результатом деления двух целых чисел и тогда его представление будет точным, странно что факт лежащий на поврхности такой трудный в понимании оказался.
    Запись от -=ЮрА=- размещена 10.06.2012 в 15:56 -=ЮрА=- вне форума
  8. Старый комментарий
    [QUOTE]- Убери запись в файл и сиди всю жизнь запоминай числа, тогда HDD не нужен будет. [/QUOTE]А человеческая память с каких пор перестала быть таковой?
    Запись от размещена 10.06.2012 в 16:00
  9. Старый комментарий
    Аватар для Evg
    Цитата Сообщение от -=ЮрА=-
    - ха вот и приехали, так в том и фишка была что дабл можно представить результатом деления двух целых чисел и тогда его представление будет точным, странно что факт лежащий на поврхности такой трудный в понимании оказался.
    Да? Ну тогда представь мне число 1.23456789123456789123456789123456789 в виде результата деления двух целых чисел

    Кстати, ответа на вопрос "зачем это нужно" до сих пор нет
    Запись от Evg размещена 10.06.2012 в 16:03 Evg вне форума
  10. Старый комментарий
    Аватар для -=ЮрА=-
    1.23456789123456789123456789123456789 * pow(10,36) = 123456789123456789123456789123456789 / pow(10,36) вот и всё.
    Что 123456789123456789123456789123456789 целое, что pow(10,36) тоже целое
    Другое дело что 5/4 = 1,25 Можно по такой логике записать как 125/100 = 5/4 т.е. необходимо всё приводить к НОК а затем решать. И скажи что стринг "1.25" будет иметь какое-либо замороченное представление
    При этом Evg Я чётко прописал ДЕЛЕНИЕ, а не представление какого либо числа!
    ответа на вопрос "зачем это нужно" до сих пор нет
    - не люблю повторять по нескольку раз
    Можно рассчитывать с любой заданной точность результат деления двух чисел! .... Полученные результаты могут быть использованы при построении специализированных вычислительных алгоритмов практически без потерь точности, которые могут использоваться для вычисления интервала энергий бозона Хигса, расчёте длинны с точностью до микрон от центра галактики до центра вселенной, звезды, "до центра васи пупкина на унитазе". Где угодно можно использовать!!!
    С таким же успехом можно говорить а накой чёрт вообще писать под линукс если есть винда и наоборот, вот так и с делением - кому надо тот найдёт применение деления с любой заданной наперёд точностью, а кто не поймёт, ну что ж вы в праве вообще ничего не читать, я как бы "за хвост никого сюда не тащу", кому интересно вот для него и посвятил эту тему.

    Не по теме:

    А давать отчёт кому-то из сети зачем оно, если даже не удосуживаемся оценить перспектив абсолютной точности я не буду:no:

    Запись от -=ЮрА=- размещена 10.06.2012 в 18:37 -=ЮрА=- вне форума
  11. Старый комментарий
    Аватар для Evg
    Цитата Сообщение от -=ЮрА=-
    Что 123456789123456789123456789123456789 целое
    Объясни мне, как в твою программу загнать такое целое число

    Цитата Сообщение от -=ЮрА=-
    Можно рассчитывать с любой заданной точность результат деления двух чисел!
    На всякий случай уведомляю, что я не идиот и до этого могу додуматься сам. У меня вопрос куда более конкретный: зачем кому-то нужно делить два целых числа друг на друга, да ещё и таким образом, что точности представления результата в виде аппаратного long double будет недостаточно?

    Цитата Сообщение от -=ЮрА=-
    Полученные результаты могут быть использованы при построении специализированных вычислительных алгоритмов практически без потерь точности
    Например, каких алгоритмов? И каким образом можно будет в этих алгоритмах использовать сформированное тобой строковое представление рационального вещественного числа?

    Цитата Сообщение от -=ЮрА=-
    для вычисления интервала энергий бозона Хигса
    Если бы речь шла о библиотеке, которая может с произвольной точностью выполнять любые операции над вещественными числами, представленными в виде строки произвольной длины, у меня бы не было никаких вопросов. Но о такой библиотеке речь не идёт. Речь идёт всего лишь о фрагменте программы, который делит два целых числа и получает результат в строковом виде. Я тебя уверяю, что для вычисления интервала энергии бозона Хиггса сие действие не нужно вообще.

    Цитата Сообщение от -=ЮрА=-
    А давать отчёт кому-то из сети зачем оно, если даже не удосуживаемся оценить перспектив абсолютной точности я не буду
    Юра, проснись и послушай, о чём я тебя спрашиваю. Я не спрашиваю о перспективах хранения чисел с произвольной точностью. Я спрашиваю, зачем это нужно в условиях, когда кроме деления двух целых чисел (да и то только тех, которые умещаются в аппаратноые ограничения хранения целого числа) в этом направлении не сделано вообще ничего?
    Запись от Evg размещена 10.06.2012 в 19:09 Evg вне форума
  12. Старый комментарий
    Во-первых это не абсолют. А во-вторых как раз истинный абсолют то и бесперспективен: каждый следующий знак менее значим, чем предыдущий, а бесконечный соответственно бесконечно не значим абсолютно в любой задаче. Да тысячный не значим во многих случаях.
    Запись от размещена 10.06.2012 в 19:54
  13. Старый комментарий
    Абсолютно для любой задачи можно найти вполне счётный номер разряда, абсолютно не значимого в этой задаче. А если возникнет более требовательная задача, то и для неё можно сделать то же самое, а для поддержки повысить точность. Но не до бесконечности. До бесконечности не только не возможно, но и не нужно.
    Запись от размещена 10.06.2012 в 19:59
  14. Старый комментарий
    Так что меняй слово "бесконечная" на слово "любая".
    Запись от размещена 10.06.2012 в 20:00
  15. Старый комментарий
    Или хотя-бы неограниченная. В данном контексте это не синоним. Не ограниченная - это значит, что можно увеличивать по потребности. А бесконечная - это именно бесконечная.
    Запись от размещена 10.06.2012 в 20:01
  16. Старый комментарий
    Юра, ты умудрился:
    1. Взяться решать задачу, которая смысла не имеет.
    2. Вместо неё решить другую, которая смысл имеет.
    Запись от размещена 10.06.2012 в 20:08
  17. Старый комментарий
    Аватар для -=ЮрА=-
    Например, каких алгоритмов? И каким образом можно будет в этих алгоритмах использовать сформированное тобой строковое представление рационального вещественного числа?
    - мне что рассказать тебе как писать классы?

    Не по теме:

    Я тебя уверяю, что для вычисления интервала энергии бозона Хиггса сие действие не нужно вообще.
    - чуваки на коллайдере на столько "позаботились" о погрешности, что мать его заявили найдено нейтрино со скоростью больше световой. Чуваки пытаются засечь частицу потоком электронов, нейтрино ну пускай масса протона, в 1800 раз массивней электрона и получается хотим на релятивистских скоростях успеть достать нейтрино электроном, да чтоб он ещё вернуться успел. А вот бы поставили цифровой фильтр, аля интерферометр Майкельсона, сразу б увидели как обстоят дела в СТО. Тож самое - волновая функция, вобще дебилы хотят подсмотреть куда же залетает электрон, а то ничё что электронный микроскоп на уровне электронов вносит возмущения это так пустяки. И так я тебе скажу во всём, а ты говоришь не нужна точность:) - ОНА ПРОСТО КАК ВОЗДУХ НЕОБХОДИМА. Теперь о бесконечностях - возьмём чёрную дыру в центре млечного пути - эммм сколько она весит, нука нука, не слышу???Что бесконечной её считаем, ну для простоты, да?Ну так вот у неё там что то около 10-15 триллионов тонн(по памяти) - в рамках даже солнечной системы это бесконечность, а в рамках "того что находится в центре большого взрыва" так небольшая флуктуация. Так что давайте абстрагируем бесконечно большое в нечто просто ОЧЕНЬ большое. Ладно я углубился в высокии материи



    До бесконечности не только не возможно, но и не нужно.
    - пойми можно до бесконечности, можно!Только и ждать результат ты тоже будешь бесконечное время алгоритм будет работать хоть до нового рождения вселенной!

    Evg,
    Если бы речь шла о библиотеке, которая может с произвольной точностью выполнять любые операции над вещественными числами, представленными в виде строки произвольной длины, у меня бы не было никаких вопросов. Но о такой библиотеке речь не идёт.
    Определи, чтобы ты хотел в ней видеть - предалагю сложение вычитание, умножение и деление с любой задаваемой пользователем точностью (в рамках разумного, т.е. в std::string думаю впихнётся до 32 тыс символов, ну вот давай точность в этих рамках ограничим, всё равно такая библиотека будет круче чем самый навёрнутый дабл, мне не охота работать через промежуточные файлы). Хотя вобще то я не должен ничего никому доказывать но раз общественность нуждается в ярких примерах, что ж пойду на поводу общественности
    Запись от -=ЮрА=- размещена 10.06.2012 в 20:19 -=ЮрА=- вне форума
  18. Старый комментарий
    [QUOTE] чуваки на коллайдере на столько "позаботились" о погрешности, что мать его заявили найдено нейтрино со скоростью больше световой. Чуваки пытаются засечь частицу потоком электронов, нейтрино ну пускай масса протона, в 1800 раз массивней электрона и получается хотим на релятивистских скоростях успеть достать нейтрино электроном, да чтоб он ещё вернуться успел. А вот бы поставили цифровой фильтр, аля интерферометр Майкельсона, сразу б увидели как обстоят дела в СТО. Тож самое - волновая функция, вобще дебилы хотят подсмотреть куда же залетает электрон, а то ничё что электронный микроскоп на уровне электронов вносит возмущения это так пустяки. И так я тебе скажу во всём, а ты говоришь не нужна точность - ОНА ПРОСТО КАК ВОЗДУХ НЕОБХОДИМА. Теперь о бесконечностях - возьмём чёрную дыру в центре млечного пути - эммм сколько она весит, нука нука, не слышу???Что бесконечной её считаем, ну для простоты, да?Ну так вот у неё там что то около 10-15 триллионов тонн(по памяти) - в рамках даже солнечной системы это бесконечность, а в рамках "того что находится в центре большого взрыва" так небольшая флуктуация. Так что давайте абстрагируем бесконечно большое в нечто просто ОЧЕНЬ большое. Ладно я углубился в высокии материи[/QUOTE]Бред. Ни кто там не возвращался и электрон в догонку не отправляли. У них учтённая погрешность аж 17 наносекунд, а полная оказалась 60. Даже на диаметре орбиты Земли это [B]гигантское[/B] значение в районе восьмого знака. На фоне достигнутой в других экспериментах точности в 12 порядков - позор.
    Запись от размещена 10.06.2012 в 20:40
  19. Старый комментарий
    Аватар для Evg
    мне что рассказать тебе как писать классы?
    При чём тут классы, когда я спрашивал об алгоритмах

    а ты говоришь не нужна точность
    Опять высокие материи. Я говорю, что не нужна точность для целочисленного деления взятого отдельно от остального мира, как это сделано у тебя. И те диферамбы, которые ты пропел про бозон хиггса и прочее - каким боком они заиспользовали у себя деление целых чисел (ведь именно об этом я и говорю с начала темы)? И, пожалйуста, не надо мне рассказывать о том, где и как используются вычисления с большой точностью. Я и сам знаю. Я веду речь не об абстрактных вычислениях, а о твоей конкретной программе.

    предалагю сложение вычитание, умножение и деление
    Как же ты с этими четырьмя операциями хочешь вычислять энергию бозона хиггса? А как же степени, логарифмы, синусы-косинусы и вся прочая портянка, которая есть в любой приличной реализации для длинных плавающих?

    т.е. в std::string думаю впихнётся до 32 тыс символов
    Да ты сделай хотя бы до 100 символов. Тогда уже и будет предмет для обсуждения. А то написать школьный алгоритм для печати десятичного представления рациональной дроби, и утверждать, что "расставлены все точки над И" - это перебор
    Запись от Evg размещена 10.06.2012 в 20:43 Evg вне форума
  20. Старый комментарий
    [QUOTE]Что бесконечной её считаем, ну для простоты, да?[/QUOTE]У чёрной дыры бесконечна плотность, а не масса. Масса конечна, но у неё нулевой объём, а он в знаменателе. Ну и напряжённость поля там бесконечна вместе с гравитационным потенциалом. Не для простоты. Эти величины [B]действительно[/B] бесконечны.
    Запись от размещена 10.06.2012 в 20:45
 
Новые блоги и статьи
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ Основная суть и тезисы по измерениям: 0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема. Объект не может перемещаться в 0D. 1D (Первое измерение):. . .
[EasyBuilder Pro] Памятка по разработке для панелей Weintek
ФедосеевПавел 26.08.2026
Памятка по разработке для панелей Weintek ВВЕДЕНИЕ Ранее, при реализации проектов основное внимание уделял разработке управляющей программы для контроллера, а панели оператора доставалось время. . .
Модель по догадкам
anaschu 25.08.2026
Прошло две недели. Я уже рассказывал, как разговаривал с сотрудниками у сортировки и как понял, что главная ветка — не про приёмку, а про отбор. Но тогда я думал, что понял механику. На этой неделе я. . .
Запись в регистр сведений независимо от заполненности табличной части
Maks 25.08.2026
Реализация из решения ниже выполнена на нетиповом документе с несколькими табличными частями, разработанного в КА2. Задача: Обеспечить запись документа в регистр сведений независимо от. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru