Бесконечная точность при делении
Запись от -=ЮрА=- размещена 10.06.2012 в 10:31
Показов 5255
Комментарии 52
Решил раз и навсегда расставить точки над И в этом вопросе. Сразу скажу - те кто действительно хочет бесконечное число знаков - читаем пункт 2, для всех остальных же рекомендую прочесть данную статью сначала![]() 1 - е Чтобы далеко в лес не ходить при достаточно большом количестве знаков после запятой можно использовать возможности форматированного вывода printf (либо std::setprecision) К примеру нужно разделить 7 на 13 : Вариант Си Для вывода 15 знаков досточно вот такого спецификатора формата %.15f (не больше, цифры 17,20, 150 после точки дадут такой же результат что и 15 )Все желающие могут проверить код под тегом InfPrecisionC. InfPrecisionC
Вариант С++ std::setprecision
2-е Ну а какже быть если нам реально надо бесконечая точностіь?Что ж у меня есть ответ и на этот вопрос Смотрим код InfPrecisionCppInfPrecisionCpp
Суть последнего алгоритма проста, постоянно получаем остаток целочисленного деления M на N множим на 10 и следующим разрядом будет результат целочисленного деления 10*(M % N) на N Скриншоты работы прилагаю | |||||||||||||||
Размещено в Без категории
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 52
Комментарии
-
Тема называется "Бесконечная точность при делении", в то время как речь идёт о точности при печати. Я не знаю, понимаешь ли ты при этом, что деление отработает одинаково вне зависимости от того, сколько знаков ты попросишь напечатать. Так же не знаю, понимаешь ли ты то, что бесконечной точности в любом случае не будет, т.к. начиная с N'ого знака после запятой результат уже будет неверным из-за округлений. Причём округления выполняются в двоичной системе счисления, а потому константы типа 0.1 в принципе не могут быть представлены точноЗапись от Evg размещена 10.06.2012 в 13:18
-
- категорически не согласен. Во внутреннем представлении машины число будет ограничено максимальным числом разрядов после запятой отведенное под конкретный тип!Хочешь бесконечной точности - делай for(i = 0; true; ) и наслаждайся бесконечной точностью
По поводу точности преставления - именно чаровский массив и позволяет хранить "довольно длинную колбасу после запятой" не парясь по поводу что в машинном представлении 0,1 = 0,09(9).
Поэтому вникни в суть, а потом пиши даёт метод бесконечную точность или нет...Запись от -=ЮрА=- размещена 10.06.2012 в 13:58
-
Запись от -=ЮрА=- размещена 10.06.2012 в 14:02
-
Запись от -=ЮрА=- размещена 10.06.2012 в 14:06
-
Подумав решил выдать код специально для тебя 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
-
Запись от -=ЮрА=- размещена 10.06.2012 в 14:20
-
Я хочу увидеть что нибудь конкретное - ошибку в логике или алгоритме, но не бабушкиных "а как это у железки 0,1 это 0,09(9)", "а как это памяти может не хватить", с кодом выше хватит и памяти лишь бы HDD позволил запихнуть файл div.txt да время нашлось столько сидеть у монитора в ожидании результата
Запись от -=ЮрА=- размещена 10.06.2012 в 14:22
-
Запись от -=ЮрА=- размещена 10.06.2012 в 14:24
-
[QUOTE]Знаешь 10 млрд знаков после запятой позволяет мне говорить - бесконечная точность. [/QUOTE]10 миддиардов - это счётное количество, а не бесконечность.Запись от размещена 10.06.2012 в 14:26 -
Если у тебя всего то 10 миллиардов (или триллионов, или даже гуглплексов) знаков, то так и пиши: высокая точность. Но не бесконечная.Запись от размещена 10.06.2012 в 14:28 -
taras atavin - чувак
- напиши программу - введи 7/13 и больше никогда в жизни не выключай машину.
Во всём нашем мышлении есть предел, мы мыслим конечными категориями, никто не в силах представить бесконечную вселенную, либо кручение в пространтсве, бесконечную "жизнь" поля и т.д. Даже в расчётах атомного реактора или бомбы есть точность вычислений, она есть во всём если точность можно сделать настолько большого порядка что немыслимо представить то можно сказать "да чуваки это бесконечно точно".Запись от -=ЮрА=- размещена 10.06.2012 в 14:31
-
taras atavin, я уже сказал нужна бесконечная точность - включи програмку и больше никогда не выключай. Название темы менять не буду так как приведенный алгоритм может обеспечивать бесконечную точность, другое дело что программист ожидающий результат будет ждать его вечно, а в текущий момент сможет лишь увидеть на экране точность которую обеспечил алгоритм за годы беспрерывной работы. Подчёркиваю мне надоело толочь воду в ступе, всё написано!Запись от -=ЮрА=- размещена 10.06.2012 в 15:11
-
Действительно, я не дочитал до конца, потому как после первого же примера читать перестал, ибо заведомо знал, что он неправильный. Так что часть своих претензий снимаю.
Сообщение от -=ЮрА=-
Претензия по поводу названия темы остаётся. Эта якобы бесконечная точность есть только при печати, но не при вычислении, потому что реального вычисления числа нету. Да и то только при делении целых чисел. А потому возникает логичный вопрос: а нафига оно надо? Т.е. какая практическая польза этих действий? Вопрос задаю всвязи с тем, что ты "решил раз и навсегда расставить точки над И в этом вопросе", а потому хотелось бы понять, что за вопрос и зачем там надо расставлять точки?Запись от Evg размещена 10.06.2012 в 15:12
-
Бесконечная память не нужна, т.к. алгоритм очевидным образом использует конечное количество переменных (две штуки). Строковая переменная для накопления результата - это всего лишь элемент удобства. Можно сразу же делать печать после вычисления очередного десятичного знака, а потому бесконечной памяти не будет
Сообщение от taras atavin
Запись от Evg размещена 10.06.2012 в 15:14
-
Ещё раз увижу записи типа
буду их изымать как флуд
Всем кому нужна бесконечная точность идут сюда
https://www.cyberforum.ru/blog... omment2689 и делают цикл бесконечным, а также исключают инкрементирование счётчика дабы избежать превышения максимального значения unsigned long. Включив программу больше никогда её не выключайте и да прибудет с вами сила, многотеррабайтный HDD и бесконечная жизнь!Запись от -=ЮрА=- размещена 10.06.2012 в 15:15
-
- читай пост выше. Свой ответ приурачивал данной теме, верней ответу на конкретный вопрос .Запись от -=ЮрА=- размещена 10.06.2012 в 15:20
-
Запись от -=ЮрА=- размещена 10.06.2012 в 15:22
-
Первые два примера действительно относятся к этой теме: печать числа с заданной точностью. Однако твоя статья в первую очередь посвящена третьему примеру: печать дроби с произвольной точностью. И вопрос у меня был такой: зачем это нужно. Потому как кроме того, чтобы что-то напечатать на экран, этот алгоритм, на первый взгляд, не умеет делать ничего другого полезного
Сообщение от -=ЮрА=-
Запись от Evg размещена 10.06.2012 в 15:24


)




