Другие языки программирования и технологии
C++ long double большие числа при умножении искажаются
Почему при выделяемом месте под 4000 цифр, при умножении больших чисел получается не то, что нужно :?
Потому, что long double - это не арифметика произвольной точности, а всего лишь обычное число с плавающей запятой, которое НЕ КОРОЧЕ double (но может полностью совпадать с double).
Так что длина long double - от 64 до 128 бит (в зависимости от используемого тобой компилятора), часть которых отводится под хранение порядка. Никаких 4000 цифр в long double нет и быть не может.
Вот как ты на уроках физики записываешь ответ в виде 1,23∙10⁴⁵ - у тебя получается всего 3 точные цифры, хотя общая длина числа - 46 цифр. Вот точно так работают и числа с плавающей запятой в компьютере: диапазон большой, а кол-во точных цифр в значении маленькое.
https://ru.wikipedia.org/wiki/Число_с_плавающей_запятой#Диапазон_чисел,_представимых_в_формате_с_плавающей_запятой
Так что длина long double - от 64 до 128 бит (в зависимости от используемого тобой компилятора), часть которых отводится под хранение порядка. Никаких 4000 цифр в long double нет и быть не может.
Вот как ты на уроках физики записываешь ответ в виде 1,23∙10⁴⁵ - у тебя получается всего 3 точные цифры, хотя общая длина числа - 46 цифр. Вот точно так работают и числа с плавающей запятой в компьютере: диапазон большой, а кол-во точных цифр в значении маленькое.
https://ru.wikipedia.org/wiki/Число_с_плавающей_запятой#Диапазон_чисел,_представимых_в_формате_с_плавающей_запятой
Arkadiy Shershnyov
То есть при больших числа он считает приблизительно? Из-за специфической записи? которую нельзя вернуть в обычные целые числа? :С
Можно пример неправильного умножения увидеть?
Arkadiy Shershnyov
та у меня 100 факториал через цикл считается и первые цифры вроде совпадают, а в конце каша :С
Да, операции с числами с плавающей точкой приводят имеют погрешность в результатах.
Теория - http://www.machinelearning.ru/wiki/index.php?title=Ошибки_вычислений
Теория - http://www.machinelearning.ru/wiki/index.php?title=Ошибки_вычислений
это где это под 4000 цифр место выделяется?
Arkadiy Shershnyov
написано 1.7*10^4900, если в программе, то при подсчете факториала
Можно разработать класс, который будет хранить и оперировать над числами любой длинны, даже более 4000 цифр. Тебе int число нужно хранить и обрабатывать? Внутри класса: приватное поле vector < int >, конструктор, заполняющий поле экземпляра стартовым значением из строки, методы, перегрузка арифметических операторов в отношении
экземпляр класса - экземпляр класса,
экземпляр класса - стандартный тип.
Достаточно непростая задача - хорошая тренировка.
Таким инструментом (разработанным классом) можно будет искать факториалы больших чисел, отдалённые Числа Фибоначчи и т. д. Вопрос времени и мощности ПК.
экземпляр класса - экземпляр класса,
экземпляр класса - стандартный тип.
Достаточно непростая задача - хорошая тренировка.
Таким инструментом (разработанным классом) можно будет искать факториалы больших чисел, отдалённые Числа Фибоначчи и т. д. Вопрос времени и мощности ПК.
Николай Саенко
Вот реализовал класс бесконечного int и перегрузил бинарный оператор +
https://pastebin.com/iHhm2N45
Если хочешь - перегрузи остальные арифметические операции.
https://pastebin.com/iHhm2N45
Если хочешь - перегрузи остальные арифметические операции.

Николай Саенко
Ещё ошибку нашёл.
Здесь https://pastebin.com/iHhm2N45
вместо 114 строки нужно написать это
for (; mind > 0;)
{
rez.push_back(mind % 10);
mind /= 10;
}
Здесь https://pastebin.com/iHhm2N45
вместо 114 строки нужно написать это
for (; mind > 0;)
{
rez.push_back(mind % 10);
mind /= 10;
}
Похожие вопросы
- c++ рандомное Double число
- Как можно написать программу на языке C, которая будет выводить числа от 1 до 1000 без if, switch, do, while, for, goto?
- Требуется калькулятор для очень больших чисел, очень больших. Есть такой?
- C++, я ввожу двухзначное число, как мне объяснить программе, что первое число это десятки, а второе единицы?
- Паскаль ДОЛГО считывает КОД с большими числами
- Delphi Как сложить два очень больших числа?
- Паскаль. Цикл While. Определить остаток от деления большего числа а на меньшее число b, не используя стандартные функции
- c++, как отрандомить случайное число типа float в диапазоне от 0 до 10 ? (пример - 0,42; 7,71)
- C# Нужно разместить 3 числа по возрастанию.
- C++ Даны три действительных числа. Возвести в квадрат те из них, значения которых неотрицательны.