Бесконечная точность при делении
Запись от -=ЮрА=- размещена 10.06.2012 в 10:31
Показов 5313
Комментарии 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
Комментарии
-
Если речь идёт о твоих первых двух примеров, то я, хоть и нечасто читаю форум, много раз видел ответы на этот вопрос. И, повторюсь, твоя статья называется "бесконечная точность при делении", а не "печать плавающих чисел с заданной точностью".
Сообщение от -=ЮрА=-
Мне кажется, что твою статью надо разделить на две. Печать на Си и на Си++ - в одну статью, всё остальное - в другую. Неплохо было бы не полениться и к обеим статьям написать нормальное сопроводительное пояснение, чтобы понятно было, какова постановка задачи. Потому как по поводу деления я постановки задачи так и не понял с практической точки зренияЗапись от Evg размещена 10.06.2012 в 15:27
-
Evg , ну почему упорно игнорируете с taras_attavin тот факт что данный алгоритм может отрабатывать сколь угодно долго и обеспечивать абсолютно любую заданную точность???Немного позже введу в код поддержку деления double на double думаю уже тогда все вопросы об утилитарности данной темы отпадут сами собой.Запись от -=ЮрА=- размещена 10.06.2012 в 15:37
-
Я не игнорирую очевидных вещей (ибо не имею такой привычки). Я могу написать бесконечный цикл и утверждать, что он может работать бесконечно долго и дескать, товарищи, не игнорируйте этот факт. Но практической пользы от этого бесконечного цикла нет. Точно так же на прямой вопрос "зачем это нужно" ты так и не дал прямого ответа
Сообщение от -=ЮрА=-
А смысл-то в этом какой? double у тебя изначально представляется не точно. Кроме случаев, когда число можно разложить в законченный ряд по отрицательным степеням двойки (что не имеет статистически значимого влияния на множество чисел, используемый в реальных задачах). В чём смысл делить два изначально неточных числа и напечатать результат с бесконечной точностью (который начиная с N'го знака будет неверным)? И опять-таки мы упираемся в то, что ты можешь что-то напечатать на экран. А кому и зачем это надо?
Сообщение от -=ЮрА=-
Запись от Evg размещена 10.06.2012 в 15:45
-
Запись от -=ЮрА=- размещена 10.06.2012 в 15:50
-
- Можно рассчитывать с любой заданной точность результат деления двух чисел! Когда доведу алгоритм он будет вот также и с даблами работать. Полученные результаты могут быть использованы при построении специализированных вычислительных алгоритмов практически без потерь точности, которые могут использоваться для вычисления интервала энергий бозона Хигса, расчёте длинны с точностью до микрон от центра галактики до центра вселенной, звезды, "до центра васи пупкина на унитазе". Где угодно можно использовать!!!Запись от -=ЮрА=- размещена 10.06.2012 в 15:53
-
Запись от -=ЮрА=- размещена 10.06.2012 в 15:56
-
[QUOTE]- Убери запись в файл и сиди всю жизнь запоминай числа, тогда HDD не нужен будет. [/QUOTE]А человеческая память с каких пор перестала быть таковой?Запись от размещена 10.06.2012 в 16:00 -
Запись от Evg размещена 10.06.2012 в 16:03
-
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
-
Объясни мне, как в твою программу загнать такое целое число
Сообщение от -=ЮрА=-
На всякий случай уведомляю, что я не идиот и до этого могу додуматься сам. У меня вопрос куда более конкретный: зачем кому-то нужно делить два целых числа друг на друга, да ещё и таким образом, что точности представления результата в виде аппаратного long double будет недостаточно?
Сообщение от -=ЮрА=-
Например, каких алгоритмов? И каким образом можно будет в этих алгоритмах использовать сформированное тобой строковое представление рационального вещественного числа?
Сообщение от -=ЮрА=-
Если бы речь шла о библиотеке, которая может с произвольной точностью выполнять любые операции над вещественными числами, представленными в виде строки произвольной длины, у меня бы не было никаких вопросов. Но о такой библиотеке речь не идёт. Речь идёт всего лишь о фрагменте программы, который делит два целых числа и получает результат в строковом виде. Я тебя уверяю, что для вычисления интервала энергии бозона Хиггса сие действие не нужно вообще.
Сообщение от -=ЮрА=-
Юра, проснись и послушай, о чём я тебя спрашиваю. Я не спрашиваю о перспективах хранения чисел с произвольной точностью. Я спрашиваю, зачем это нужно в условиях, когда кроме деления двух целых чисел (да и то только тех, которые умещаются в аппаратноые ограничения хранения целого числа) в этом направлении не сделано вообще ничего?
Сообщение от -=ЮрА=-
Запись от Evg размещена 10.06.2012 в 19:09
-
Так что меняй слово "бесконечная" на слово "любая".Запись от размещена 10.06.2012 в 20:00 -
Юра, ты умудрился:
1. Взяться решать задачу, которая смысла не имеет.
2. Вместо неё решить другую, которая смысл имеет.Запись от размещена 10.06.2012 в 20:08 -
- мне что рассказать тебе как писать классы?
Не по теме:
- чуваки на коллайдере на столько "позаботились" о погрешности, что мать его заявили найдено нейтрино со скоростью больше световой. Чуваки пытаются засечь частицу потоком электронов, нейтрино ну пускай масса протона, в 1800 раз массивней электрона и получается хотим на релятивистских скоростях успеть достать нейтрино электроном, да чтоб он ещё вернуться успел. А вот бы поставили цифровой фильтр, аля интерферометр Майкельсона, сразу б увидели как обстоят дела в СТО. Тож самое - волновая функция, вобще дебилы хотят подсмотреть куда же залетает электрон, а то ничё что электронный микроскоп на уровне электронов вносит возмущения это так пустяки. И так я тебе скажу во всём, а ты говоришь не нужна точность:) - ОНА ПРОСТО КАК ВОЗДУХ НЕОБХОДИМА. Теперь о бесконечностях - возьмём чёрную дыру в центре млечного пути - эммм сколько она весит, нука нука, не слышу???Что бесконечной её считаем, ну для простоты, да?Ну так вот у неё там что то около 10-15 триллионов тонн(по памяти) - в рамках даже солнечной системы это бесконечность, а в рамках "того что находится в центре большого взрыва" так небольшая флуктуация. Так что давайте абстрагируем бесконечно большое в нечто просто ОЧЕНЬ большое. Ладно я углубился в высокии материи
- пойми можно до бесконечности, можно!Только и ждать результат ты тоже будешь бесконечное время алгоритм будет работать хоть до нового рождения вселенной!
Evg,
Определи, чтобы ты хотел в ней видеть - предалагю сложение вычитание, умножение и деление с любой задаваемой пользователем точностью (в рамках разумного, т.е. в std::string думаю впихнётся до 32 тыс символов, ну вот давай точность в этих рамках ограничим, всё равно такая библиотека будет круче чем самый навёрнутый дабл, мне не охота работать через промежуточные файлы). Хотя вобще то я не должен ничего никому доказывать но раз общественность нуждается в ярких примерах, что ж пойду на поводу общественности
Запись от -=ЮрА=- размещена 10.06.2012 в 20:19
-
При чём тут классы, когда я спрашивал об алгоритмах
Опять высокие материи. Я говорю, что не нужна точность для целочисленного деления взятого отдельно от остального мира, как это сделано у тебя. И те диферамбы, которые ты пропел про бозон хиггса и прочее - каким боком они заиспользовали у себя деление целых чисел (ведь именно об этом я и говорю с начала темы)? И, пожалйуста, не надо мне рассказывать о том, где и как используются вычисления с большой точностью. Я и сам знаю. Я веду речь не об абстрактных вычислениях, а о твоей конкретной программе.
Как же ты с этими четырьмя операциями хочешь вычислять энергию бозона хиггса? А как же степени, логарифмы, синусы-косинусы и вся прочая портянка, которая есть в любой приличной реализации для длинных плавающих?
Да ты сделай хотя бы до 100 символов. Тогда уже и будет предмет для обсуждения. А то написать школьный алгоритм для печати десятичного представления рациональной дроби, и утверждать, что "расставлены все точки над И" - это переборЗапись от Evg размещена 10.06.2012 в 20:43


)




