Другие языки программирования и технологии

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

Почему при выделяемом месте под 4000 цифр, при умножении больших чисел получается не то, что нужно :?
Arkadiy Shershnyov
Arkadiy Shershnyov
1 238
Потому, что long double - это не арифметика произвольной точности, а всего лишь обычное число с плавающей запятой, которое НЕ КОРОЧЕ double (но может полностью совпадать с double).

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

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

https://ru.wikipedia.org/wiki/Число_с_плавающей_запятой#Диапазон_чисел,_представимых_в_формате_с_плавающей_запятой
Rovsan Mammadov
Rovsan Mammadov
95 334
Лучший ответ
Arkadiy Shershnyov То есть при больших числа он считает приблизительно? Из-за специфической записи? которую нельзя вернуть в обычные целые числа? :С
Можно пример неправильного умножения увидеть?
Arkadiy Shershnyov та у меня 100 факториал через цикл считается и первые цифры вроде совпадают, а в конце каша :С
Да, операции с числами с плавающей точкой приводят имеют погрешность в результатах.
Теория - http://www.machinelearning.ru/wiki/index.php?title=Ошибки_вычислений
Алексей ***
Алексей ***
30 477
это где это под 4000 цифр место выделяется?
Arkadiy Shershnyov написано 1.7*10^4900, если в программе, то при подсчете факториала
Можно разработать класс, который будет хранить и оперировать над числами любой длинны, даже более 4000 цифр. Тебе int число нужно хранить и обрабатывать? Внутри класса: приватное поле vector < int >, конструктор, заполняющий поле экземпляра стартовым значением из строки, методы, перегрузка арифметических операторов в отношении
экземпляр класса - экземпляр класса,
экземпляр класса - стандартный тип.
Достаточно непростая задача - хорошая тренировка.
Таким инструментом (разработанным классом) можно будет искать факториалы больших чисел, отдалённые Числа Фибоначчи и т. д. Вопрос времени и мощности ПК.
Николай Саенко Вот реализовал класс бесконечного int и перегрузил бинарный оператор +
https://pastebin.com/iHhm2N45
Если хочешь - перегрузи остальные арифметические операции.
Николай Саенко Ещё ошибку нашёл.
Здесь https://pastebin.com/iHhm2N45
вместо 114 строки нужно написать это
for (; mind > 0;)
{
rez.push_back(mind % 10);
mind /= 10;
}