Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

C++ long double большие числа при умножении искажаются

Desu Мастер (1268), закрыт 1 год назад
Почему при выделяемом месте под 4000 цифр, при умножении больших чисел получается не то, что нужно :?
Дополнен 6 лет назад
а, используется ostringstream и форматированный ввод, он может изменять числа в экспоненциальной записи неправильно?
Лучший ответ
Андрей Высший разум (466062) 6 лет назад
Потому, что long double - это не арифметика произвольной точности, а всего лишь обычное число с плавающей запятой, которое НЕ КОРОЧЕ double (но может полностью совпадать с double).

Так что длина long double - от 64 до 128 бит (в зависимости от используемого тобой компилятора), часть которых отводится под хранение порядка. Никаких 4000 цифр в long double нет и быть не может.

Вот как ты на уроках физики записываешь ответ в виде 1,23∙10⁴⁵ - у тебя получается всего 3 точные цифры, хотя общая длина числа - 46 цифр. Вот точно так работают и числа с плавающей запятой в компьютере: диапазон большой, а кол-во точных цифр в значении маленькое.

https://ru.wikipedia.org/wiki/Число_с_плавающей_запятой#Диапазон_чисел,_представимых_в_формате_с_плавающей_запятой
DesuМастер (1268) 6 лет назад
То есть при больших числа он считает приблизительно? Из-за специфической записи? которую нельзя вернуть в обычные целые числа? :С
Андрей Высший разум (466062) Числа с плавающей запятой всегда считаются приблизительно. Подробности дописал в основной ответ.
Остальные ответы
Валерий Шестаков Просветленный (25528) 6 лет назад
это где это под 4000 цифр место выделяется?
DesuМастер (1268) 6 лет назад
написано 1.7*10^4900, если в программе, то при подсчете факториала
Валерий Шестаков Просветленный (25528) предлагаю вывести sizeof(long double) и помедитировать над понятием "плавающая точка"
Иван Сигаев Искусственный Интеллект (155175) 6 лет назад
Можно пример неправильного умножения увидеть?
DesuМастер (1268) 6 лет назад
та у меня 100 факториал через цикл считается и первые цифры вроде совпадают, а в конце каша :С
Иван Сигаев Искусственный Интеллект (155175) Логично - особенность хранения чисел в формате "плавающей запятой" Для простоты представь, что число хранится в формате первые три цифры и количество "нулей" 123 = 123 (0) 1234 = 123 (1) 1234567890 = 123 (7) 0.00123 = 123 (-5)
ivtst1 Просветленный (30511) 6 лет назад
Да, операции с числами с плавающей точкой приводят имеют погрешность в результатах.
Теория - http://www.machinelearning.ru/wiki/index.php?title=Ошибки_вычислений
Роман Protocol Мыслитель (8562) 6 лет назад
Можно разработать класс, который будет хранить и оперировать над числами любой длинны, даже более 4000 цифр. Тебе int число нужно хранить и обрабатывать? Внутри класса: приватное поле vector < int >, конструктор, заполняющий поле экземпляра стартовым значением из строки, методы, перегрузка арифметических операторов в отношении
экземпляр класса - экземпляр класса,
экземпляр класса - стандартный тип.
Достаточно непростая задача - хорошая тренировка.
Таким инструментом (разработанным классом) можно будет искать факториалы больших чисел, отдалённые Числа Фибоначчи и т. д. Вопрос времени и мощности ПК.
Роман ProtocolМыслитель (8562) 6 лет назад
Вот реализовал класс бесконечного int и перегрузил бинарный оператор +
https://pastebin.com/iHhm2N45
Если хочешь - перегрузи остальные арифметические операции.
Роман ProtocolМыслитель (8562) 6 лет назад
Ещё ошибку нашёл.
Здесь https://pastebin.com/iHhm2N45
вместо 114 строки нужно написать это
for (; mind > 0;)
{
rez.push_back(mind % 10);
mind /= 10;
}
Похожие вопросы