2016-12-22 4 views
-1

Я пытаюсь разработать программу на C++, чтобы умножить число (скажем, 2.45784e-05) на себя 28224 раза. После умножения я должен выполнить другую задачу на выходе. Для того, чтобы умножить число с самими собой, я пишу программу на C++ следующим образом:Как умножить очень небольшое число с собой более 100 раз в C++?

#include<iostream> 
    using namespace std; 
    int main() { 
     long double x = 2.45784e-05, y = 1; 
     cout << "Before multiplication, x= " << x << endl; 
     for (int i = 0; i < 28224; i++) { 
      y = y * x; 
      cout <<i+1<<". "<< "y=" << y << endl; 
     } 

     return 0; 
    } 

Но программа дает точный выход до 1075 раз. После этого он дает 0 в качестве вывода. Получены следующие результаты:

Before multiplication, x= 2.45784e-05 
1. y=2.45784e-05 
2. y=6.04098e-10 
3. y=1.48478e-14 
4. y=3.64934e-19 
. 
. 
. 
1073. y=1.15885e-4946 
1074. y=3.6452e-4951 
1075. y=0 
1076. y=0 
. 
. 
. 
28223. y=0 

Мои друзья посоветовали мне умножать константу с x каждый раз после умножения на себя. Но я не понимаю, как умножать константу с ней. Пожалуйста, дайте мне решение, чтобы получить результат.

+0

Вам нужно написать класс, который обрабатывает произвольно точные числа –

+2

И подсказка: есть функция * предварительного просмотра *. Вы хотите, чтобы мы тратили свое время, чтобы помочь вам, поэтому потратите 30 дополнительных секунд, чтобы правильно форматировать/отступать весь исходный код! – GhostCat

+1

И тогда ваша фактическая проблема заключается в том, что типы, такие как int, long, double ...есть ** диапазон ** в этот день работа. Вы хотите потратить некоторое время на изучение математики за первым; чтобы прояснить вашу идею для себя ... – GhostCat

ответ

1

Каждый раз, когда вы умножаете свой номер на себя, он увеличивает количество требуемых цифр для сохранения. Ну, честно говоря, даже из этих 1075, я думаю, что в основном половина достаточно правильная или даже меньше, другие будут сходиться к близлежащим числам, которые могут быть представлены как длинный двойной. Чтобы сделать трюк, который вы хотите, вам нужно использовать некоторые библиотеки 3rdparty с математикой произвольного назначения. Посмотрите на список здесь:

https://en.wikipedia.org/wiki/List_of_arbitrary-precision_arithmetic_software

Что ваши друзья хотят, чтобы ты не поможешь: постоянное умножение будет двигаться десятичной точкой, но не уменьшит количество цифр, необходимых для оценки.

EDIT: @ решения Borgleader выглядит довольно хорошо (повышающий: multiprecision).

+0

Спасибо. После установки «Boost Multiprecision Library» я получаю точный результат. –

0

Приведенные x = 2.45784e-05 и y = 28224 и вы хотите x^y (мощность). Найдите s (масштаб), так что z = x * s, 0 < z < 1 (s = 10^6) , тогда ваш ответ равен (z/s)^y = z^y/s^y. Если s равно 10^6, вы можете вычислить s^y как 10^(6 * y).

Я ожидаю, что z^y все еще будет переполняться, но это произойдет для более высокого показателя , а затем вы сможете уточнить эту идею. Подсказка: попробуйте использовать s как мощность 2.

1

Проблема здесь на самом деле не в точности (или сама по себе, это только часть проблемы, но не существенная).

Основная проблема здесь является диапазоном, что результирующее число слишком мало, чтобы быть представленными в double (результат показатель выходит за пределы диапазона от минимального показателя в double представления). Таким образом, для компьютера оно равно 0.

Идея умножить значение на некоторое число, чтобы увеличить его (например, «шкала»), может работать, и тогда вам нужно будет компенсировать показатель результата.

Также обратите внимание, что если вы хотите умножить одно и то же число несколько раз, вы можете вместо этого использовать pow(num, N), что будет намного быстрее, если N велико.

Смежные вопросы