c++ - C++ 中的 double (或 pow(2, 1000))

标签 c++ precision exponential

我正在研究 Project Euler,以复习我的 C++ 编码技能,为下学期我们将要面对的编程挑战做准备(因为他们不让我们使用 Python,嘘!)。

我在#16,我正试图找到一种方法来保持 2¹°°° 的真实精度

例如:

int main(){
    double num = pow(2, 1000);
    printf("%.0f", num):
    return 0;
}

打印

10715086071862673209484250490600018105614050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

缺少大部分数字(来自 python):

>>> 2**1000

10715086071862673209484250490600018105614048117055336074437503883703510511249361224931983788156958581275946729175531468251871452856923140435984577574698574803934567774824230985421074605062371141877954182153046474983581941267398767559165543946077062914571196477686542167660429831652624386837205668069376L

当然,我可以用 Python 1 内衬编写程序

sum(int(_) for _ in str(2**1000))

这会立即给我结果,但我正试图找到一种在 C++ 中执行此操作的方法。任何指针? (哈哈……)

编辑:

标准库之外的东西对我来说毫无值(value)——在那些竞赛中只允许使用死树代码,而且我可能不会打印出 10,000 行外部代码...

最佳答案

如果您只跟踪字符数组中的每个数字,这很容易。将一个数字加倍是微不足道的,如果结果大于 10,你只需减去 10 并在下一个数字上加一个进位。从值 1 开始,将加倍函数循环 1000 次,就完成了。您可以使用 ceil(1000*log(2)/log(10)) 预测所需的位数,或者动态添加它们。

剧透警告:看来我必须先展示代码才能让任何人相信我。这是一个 bignum 的简单实现,它有两个函数,Double 和 Display。为了简单起见,我没有把它作为一个类。数字以小端格式存储,最低有效位在前。




typedef std::vector<char> bignum;

void Double(bignum & num)
{
    int carry = 0;
    for (bignum::iterator p = num.begin();  p != num.end();  ++p)
    {
        *p *= 2;
        *p += carry;
        carry = (*p >= 10);
        *p -= carry * 10;
    }
    if (carry != 0)
        num.push_back(carry);
}

void Display(bignum & num)
{
    for (bignum::reverse_iterator p = num.rbegin();  p != num.rend();  ++p)
        std::cout << static_cast<int>(*p);
}

int main(int argc, char* argv[])
{
    bignum num;
    num.push_back(1);
    for (int i = 0;  i < 1000;  ++i)
        Double(num);
    Display(num);
    std::cout << std::endl;
    return 0;
}

关于c++ - C++ 中的 double (或 pow(2, 1000)),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3389195/

相关文章:

c++ - MITM 代理,TLS 1.2 证书验证失败

c++ - g++ 4.5 找不到友元函数

JavaScript 精度

javascript - 避免指数表示法和字符串

python - 如果我的目标函数是非线性(也是指数解释)函数,我应该使用什么求解器? python 壁虎

function - 如何在 MATLAB 中得到 (-8)^0.333333 = -2?

c++ - 在 C++ 中使用 TCP 套接字进行远程客户端和服务器通信

c++ - 如何找到由 3 个点和 3 个红外 LED 组成的三角形的旋转和平移

decimal - 限制计算中的小数精度

c++ - (1 + sqrt(2))^2 = 3 + 2*sqrt(2) 在浮点运算中是否满足?