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<double>::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? [复制]的主要内容,如果未能解决你的问题,请参考以下文章