C中的几个复杂的指数运算返回inf? [复制]

Posted

技术标签:

【中文标题】C中的几个复杂的指数运算返回inf? [复制]【英文标题】:A couple of complicated exponential operations in C return inf? [duplicate] 【发布时间】:2020-10-05 14:35:13 【问题描述】:
#include <stdio.h>
#include <math.h>
int main()
   printf("Hello World! \n");
    double a = 56;
    double b = pow(a,a);
    double c = pow(b,b);
    double d = pow(c,c);
    double e = pow(d,d);
    printf("%lf\n", e);
    return 0;

当我运行它时,我会看到“Hello World”,然后是“inf”...... 目的是创建一个可以绕过操作系统干预使计算机崩溃的 C 程序,如果这完全合理的话?

【问题讨论】:

你在问如何打印一个比宇宙中原子数多的数字? 目的是让我的电脑崩溃 这很难做到,因为现代操作系统被设计成不会因为一个流氓程序而崩溃。 @AnAnt 在 Python 中尝试以 56.0 开头的相同代码,您将得到与 C 相同的结果。Python 具有无限精度整数,您的原始代码不是甚至在 Python 中使用双打,所以完全不同 @AnAnt 没有。它不会。行为将是未定义的。如果要使计算机挂起,请以malloc 递增分配内存并将垃圾写入其中。这基本上就是 Python 代码正在做的事情 【参考方案1】:

pow(a,a) 已经有 98 个十进制数字

e 超越了std::numeric_limits&lt;double&gt;::max()

我不知道在哪里使用pow(56, 56)

在 c++ 中,我们有一个大小为 1、2、4、8 字节的“盒子”。要解决大多数问题,这就足够了。但是,有时需要进行大量操作。对于大数可以使用boost::multiprecision。但对于某些任务,这可能还不够。

但 c++ 并不关心这一点,因为 c++ 关心性能。

你知道 cpu-cache 吗?看how-do-cache-lines-work。

每当处理器想要从主存中获取数据时,它首先会查看缓存缓冲区以查看相应的地址是否存在于缓冲区中。如果存在,则使用缓存执行操作;无需从主内存中获取。这称为“缓存命中”。

如果地址不在缓存中,则称为“缓存未命中”。如果发生高速缓存未命中,则意味着处理器已进入主存获取地址,并且需要更多时间。

【讨论】:

对,这样做不可能吗?但是python尝试... 我会尝试更新我的答案,以便清楚 @AnAnt “对,这样就不可能了?” - 这毫无疑问是不可能的。 “但 python 会尝试” - 除非你的计算机具有几乎无限的内存和无限的时间,否则它永远不会完成。 我的目标不是得到答案,而是让我的电脑崩溃,我希望 C 能和 python 一样好...... @AnAnt 我更新了答案。你可以为此编写你的库,或者搜索一个现成的。

以上是关于C中的几个复杂的指数运算返回inf? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

excel的几个常用函数

C++性能系列之函数与函数参数的几个原则

从数字到varchar的CAST返回指数值? [复制]

剑指offer 25.复杂链表的复制

[Dart] Flutter开发中的几个常用函数

时间复杂度吐血总结