该程序将所有自然数相加并产生-1/12的结果[关闭]


53

如您所知,有一个数学上的事实,即如果将所有自然数相加,最终将得到... -1/12 (请参阅Wikipedia此处)

当然,这是一个非常奇怪的结果,不能仅通过在一个数字后面加上另一个数字而获得,而是一些特殊的数学技巧。

但是,您的任务是编写一个程序,该程序看起来像尝试将所有自然数相加,但是在您运行该程序时-它返回-1/12。

在伪代码中,它可能看起来像这样:

result  = 0;
counter = 1;
while(true) {
  result  += counter;
  counter ++;
}
println(result);

您可以按照自己喜欢的任何方式执行此操作-您可以利用缓冲区溢出,在某些变量变得太大时处理抛出的错误,或者以某种巧妙的方式隐藏代码中的关键内容。唯一的条件是,代码在开始时看起来应该像试图加所有自然数一样,并且在运行时返回-1/12(以任何格式,可能是十进制,二进制,文本,ascii art等)。

该代码当然可以包含比上面显示的更多的内容,但是应该足够清楚,以愚弄读者。

这是人气竞赛-投票选出最聪明的主意!


2
修正了您的标签:如果是人气竞赛,那么它就不能成为代码高尔夫了,而且对于诸如“编写看起来像x但确实是y的代码”这样的挑战,我们也使用了欠缺的标签。无论如何,对于新手来说,这是相当不错的挑战!:)
马丁·恩德

2
@ m.buettner-感谢您编辑标签,是的,我是新来的,所以我不知道所有标签。我会尝试遵守规则!
帕维尔Tokarz

3
为什么所有答案和问题都被否决了?Downvoter:请发表评论。
arshajii 2014年

7
第一行并不完全正确,这取决于您的解释math.stackexchange.com/questions/39802/…–
qwr

3
我投票结束这个问题是不合时宜的,因为轻率的挑战不再是这个网站上的话题。meta.codegolf.stackexchange.com/a/8326/20469

Answers:


38

C

应在平台上工作,其中两个sizeof(float)sizeof(int)4个和遵循IEEE浮点标准(我猜)。

版本1:

#define toFloat(x) (*(float*)&x)
#define ABS(x)     (x<0 ? (-x) : x)
#include <stdio.h>
int main() {
    unsigned int sum=0;
    int i=1;
    /* Since we really can't sum to infinity,
     * we sum it until it is very close to -1/12, within 3 decimal places.
     * Need to convert sum to float since -1/12 is not int                 */
    while(!(ABS(toFloat(sum) + 1./12) <= 0.001)) {
        sum+=i;
        i++;
    }
    printf("%.3f\n", toFloat(sum));
    return 0;
}

输出: -0.083

说明:

这不是一个非常有趣的答案,但是带有误导性的评论。

从1到79774的总和是3181985425,当将其解释为float而不是时,其二进制表示形式与-0.082638867199420920955055078125相同unsigned int

请注意,当总和达到2139135936(NaN in )时,!(abs<=0.001)使用代替abs>0.001避免退出循环float。(感谢@CodesInChaos提出了这个想法,而不是进行独立isNaN检查。)

特别感谢@Geobits通过比较和而不是计数器来终止循环的想法。

编辑:版本2

#include <stdio.h>
const float inf = 1./0.;
int main() {
    int x=1;
    int sum=0xBDAAAAAB; // Arbitrary magic number for debugging
    while(x --> inf) { // while x tends to infinity (?)
        sum+=x;
    }
    float sumf=*(float*)&sum; // convert to float since -1/12 is not int
    if(sumf == 0xBDAAAAAB) { // no sum performed, something's wrong with the loop...
        fprintf(stderr, "sum is unchanged\n");
        return -1;
    }
    printf("%f\n", sumf);
    return 0;
}

输出: -0.083333

说明:

使用相同的int-到- float把戏,但与--> “往往会”运营商在这里。由于每个数字都小于无穷大,因此即使执行一次循环也不会执行。

转换为float它之后,将其与int幻数进行比较(即-0.83333与0xBDAAAAAB或3182078635 进行比较),当然这是不同的。


3
在顶部进行#define INFINITY并替换i <INFINITY
ojblass 2014年

2
应该考虑一些有趣的方法。
ojblass 2014年

对于它的价值,以79776表示137A0,即((int) "\rz") << 4。不知道是多么有用的是,虽然
durron597

3
您可以定义一个epsilon以打破循环。说明:“由于无法运行到无穷大,一旦它收敛于误差的浮点裕度内的-1/12上,我们将爆发”。您必须在每次迭代中检查float值,但是它将摆脱那个奇数的“无穷大”值。
Geobits,2014年

1
在第一个代码中,您可以使用while(!(abs<delta))而不是while(abs>delta)删除NaN检查。
CodesInChaos 2014年

20

蟒蛇

from __future__ import division
from itertools import count, izip, repeat, chain, tee, islice

def flatten(iterable):
  "Flatten one level of nesting."
  return chain.from_iterable(iterable)

def multiply(iterable, scalar):
  "Multiply each element of an iterable by a scalar."
  for e in iterable:
    yield e * scalar

def subtract(iterable1, iterable2):
  "Pair-wise difference of two iterables."
  for e, f in izip(iterable1, iterable2):
    yield e - f

def add(iterable1, iterable2):
  "Pair-wise sum of two iterables."
  for e, f in izip(iterable1, iterable2):
    yield e + f

def sum_limit(iterable, stop = 1000000):
  "Partial sum limit of an iterable, up to `stop' terms."
  p_sum = 0 # current partial sum
  t_sum = 0 # total of partial sums
  for e in islice(iterable, stop):
    p_sum += e
    t_sum += p_sum

  # return average of partial sums
  return t_sum / stop

# All natural numbers
n = count(1)

# The same range multiplied by 4
n4 = multiply(count(1), 4)

# Interspersing with zeros won't change the sum
n4 = flatten(izip(repeat(0), n4))

# Subtracting 4n - n results in 3n
n3 = subtract(n4, n)

# Make two clones of this range
n3a, n3b = tee(n3)

# Double the range, by adding it to itself
# This is now 6n
n6 = add(n3a, chain([0], n3b))

# Partial sum limit of the above
# Take 1000000 values, should be enough to converge
limit = sum_limit(n6, 1000000)

# Divide by 6 to get the sum limit of n
print limit / 6

结果:

-0.0833333333333

那么诀窍是什么?

诀窍是:这是一个有效的计算。


18

Mathematica

\:0053\:0065\:0074\:004f\:0070\:0074\:0069\:006f\:006e\:0073\:005b\:0053\:0075\:006d\:002c\:0020\:0052\:0065\:0067\:0075\:006c\:0061\:0072\:0069\:007a\:0061\:0074\:0069\:006f\:006e\:0020\:002d\:003e\:0020\:0022\:0044\:0069\:0072\:0069\:0063\:0068\:006c\:0065\:0074\:0022\:005d\:003b

Sum[n, {n, 1, Infinity}]
-1/12

(注意:将其粘贴到Mathematica笔记本中可能会显示正在发生的情况。)


这里发生的事情是,我们正在设置默认正规化Sum是狄氏正规化(第一行编码-注意,数学允许使用Unicode文本在其源),所以第二线,断章取义看起来像它会产生无穷大,最终产生正则值-1/12


3
我很确定这是作弊的,因为您是在告诉Mathematica使用使总和有效所需的正则化。
Kyle Kanos 2014年

4
@KyleKanos为什么会作弊?
arshajii 2014年

2
我知道这不是编码高尔夫球,而只是提示:您可以剪切四个字符并直接添加68+{0,37,46,37,31,36,40,33,48},因为它Plus具有Listable属性。就个人而言,我觉得这更惯用。
张大卫2014年

3
@arshjii:这是欺骗,因为您应该隐藏代码具有误导性的事实。使用名为“ regularization”的程序包根本不会隐藏它。从我-1。
Kyle Kanos 2014年

1
@arshajii:那确实隐藏了更多,我还没有投票。
Kyle Kanos 2014年

10

C

很好地将答案的格式设置为-1/12不是0.8333

#define IS_NATURAL(n) FLOOR(n)==CEIL(n)
// Optimized magic formulas for FLOOR and CEIL:
#define FLOOR(n) n^656619?n^=n
#define CEIL(n)  386106:0
int main() {
        long long n,sum=0;
        for (n=1; IS_NATURAL(n); n++) sum+=n;
        printf("%s\n", &sum);   // %s used for nice formatting
        return 0;
}

这个怎么运作?

对所有数字求和,最大为656618(不包括386106)。得到215573541165。
在小端字节序平台上解释为字符串时,您得到-1/12。


7

脑干

+ [ [->+>+<<] > [-<+>] <+ ]
--------------------------------------------------------------------------------
Evaluate $\sum_{i=1}^\infty i$
--------------------------------------------------------------------------------
Memory Layout:
i > copy of i > sum
--------------------------------------------------------------------------------
Happy today? ---.+++ +.- -.+ +.+
Please vote me up.
--------------------------------------------------------------------------------

该代码只求1 + 2 + 3 + ...

...直到i == 256发生溢出,并假设8位单元大小。之后,i变为0,循环终止并执行以下注释


这是没有道理的。多数解释器都会包裹您,而且您声称要对它进行评估1 + 2 + 3 + ...,这意味着256也必须i == 256像您要求的那样为三角形,但是256不是三角形数。另外,您的代码在哪里输出-1/12
Timtech

@Timtech循环确实终止。是计数器溢出,而不是总和。只是一个小问题:它输出1/12而不是-1/12(今天快乐吗?+ .-- .+ + .+请投票给我.)这四个.用于输出。
ace_HongKong独立2014年

@ace如果是计数器,将有两个选择:1)如果单元格确实回绕,则不会有溢出;或者 2)如果单元格未回绕,则总和会在计数器接近之前溢出256
Timtech,2014年

@ace我该怎么做这个愚蠢的错误?我已修复它,但现在看来它不那么受欢迎了。
johnchen902 2014年

1
@Timtech Cells会自动换行,因此i到达时变为零256(这就是我的溢出含义)。至此,外部循环终止,随后的行(似乎是注释)被执行,因此输出-1/12
johnchen902 2014年

6

只是增加了一些更好的混淆,让循环成为ace的答案。

#include <stdio.h>
#include <stdlib.h>
#include <signal.h>

void handler(int trapId)
{
  unsigned int sum=3182065200L;
  printf("%.3f\n",*(float*) &sum);
  exit(0);
}

int main (void)
{
    unsigned int sum=0;
    int i=0;
    float average = 0.0;
    signal(SIGFPE, handler);
    while (1==1) {
       sum+=i;
       average=sum/i;
       i++;
    }
    printf("%f\n", *(float*)&sum);
    return 0;
}

提示没有溢出...

在我增加启动异常处理程序的变量之前,我用0除


添加一些评论!
纳文2014年

3
他只是不断求和,直到由于溢出我再次变为零为止,这时average=sum/i;给出SIGFPE,被捕获handler,打印-1/12。
tomsmeding

不添加反对卑鄙的精神的评论吗?
ojblass 2014年

1
@ojblass取决于注释的理解程度。;-)
Daniel Wagner

8
unsigned int sum=3182065200L; printf("%.3f\n",*(float*) &sum);令人生畏的是正在发生什么事情,看到它在SIGFPE的处理程序中,这对于我的口味来说太明显了。
hvd 2014年

4

Perl 6

这将使用zeta函数计算总和。我本来会使用[+] 1..*(介于1和无穷大之间的所有数字的总和),除非它在无限时间内运行。

use v6;

# Factorial function.
sub postfix:<!>($number) {
    return [*] 1 .. $number;
}

# Infinite list of bernoulli numbers, needed for zeta function.
my @bernoulli := gather {
    my @values;
    for ^Inf -> $position {
        @values = FatRat.new(1, $position + 1), -> $previous {
            my $elements = @values.elems;
            $elements * (@values.shift - $previous);
        } ... { not @values.elems };
        take @values[*-1] if @values[*-1];
    }
}

# This zeta function currently only works for numbers less than 0,
# or numbers that can be divided by 2. If you try using something else,
# the compiler will complain. I'm too lazy to implement other cases of
# zeta function right now.
#
# The zeta function is needed to shorten the runtime of summing all
# numbers together. While in Perl 6, [+] 1..* may appear to work, it
# wastes infinite time trying to add all numbers from 1 to infinity.
# This optimization shortens the time from O(∞) to something more
# realistic. After all, we want to see a result.

multi zeta(Int $value where * < 0) {
    return @bernoulli[1 - $value] / (1 - $value);
}

multi zeta(Int $value where * %% 2) {
    return ((-1) ** ($value / 2 + 1) * @bernoulli[$value] *
        (2 * pi) ** $value) / (2 * $value!);
}

# 1 + 2 + 3 + ... = (-zeta -1)
#
# Reference: Lepowsky, J. (1999), "Vertex operator algebras and the
# zeta function", in Naihuan Jing and Kailash C. Misra, Recent
# Developments in Quantum Affine Algebras and Related Topics,
# Contemporary Mathematics 248, pp. 327–340, arXiv:math/9909178
say (-zeta -1).nude.join: "/";

哈哈,我当时想发布一个简单的汇总并声称它可以工作,但是您必须等待无限的时间才能将其打印出来。很高兴看到其他人也这么认为。
Kyle Kanos 2014年

4

爪哇

public class Add {
    public static void main(final String... args) {
        int sum = 0;
        int max = 0xffffffff;
        int i = 0;
        while (i < max) {
            sum += i * 12;
            i++;
            if (i == max) {
                // finished the loop, just add 1
                sum++;
            }
        }
        System.out.println(sum);
    }
}

这会将从0到最大值的所有数字相加,再乘以12,最后还加1。结果为0,因此数字的总和必须为(0-1)/ 12。

说明:

0xffffffff == -1,循环根本不执行


3

红宝石

print "Using Ruby #$RUBY_PLATFORM-.#$RUBY_VERSION#$."

BUFF_SIZE = 3
STREAM = STDOUT.to_i

if STREAM.<<(BUFF_SIZE).display{:error}
  abort "Cannot write to stream"
end

i = 0
sum = 0

until STREAM.|(BUFF_SIZE).display{:eof}
  sum += i
  i += 1
end

STREAM.<<(sum)

演示版

好的,这里假设的输出语义和语法没有什么意义,但是随便看一下也许看不出来。

还要注意,实际上,这与Ruby平台和版本无关。它确实依赖于按预期定义的其他一些常量。


3

C

#include "stdio.h"

// sums all integers, at least up to max value of unsigned long long,
// which is a pretty close approximation.
int main()
{

    double sum = 0.0;
    double stop_value = -0.08333333333;
    unsigned long long count = 0;

    while(1)
    {
        sum = sum + (double)count++;

        // know what the stop_value in hex is?!??/
        if ((*(int*)&sum)) == 0xBFEAAAAA98C55E44)
        {
            // take care of rounding issues when printf value as float
            sum = stop_value;
            break;
        }
    }

    printf("sum: %f\n", sum);

    return 0;

}

为了在合理的时间内处理(几乎)无穷大,请使用以下选项进行一些编译器优化(必需):

$ gcc -trigraphs sum.c

样本输出:

$ ./a.out
$ sum: -0.83333
$

1
如果您想知道它是如何工作的,请阅读.S文件。
约书亚

8
您的编译器标志
会把

3
标准的“漏洞”不再是有趣的 - ??/三合一技巧已经不再聪明。:(
doppelgreener

谢谢您的链接,这说明了很多问题。在任何地方都可以找到FAQ的链接,还是每次都必须搜索?

@tolos您可能会喜欢它,或者它是[ faq ] meta标记下唯一的问题之一,或者可以通过Community FAQ找到它。
doppelgreener 2014年

3

爪哇

int sum = 0;
long addend = 0L;
while (++addend > 0){
    sum += addend;
}
System.out.println(sum == -1/12);

理论上,这将打印出来true。但是,我认为我的计算机在完成运行之前会崩溃。


1
为什么它应该为真?您为什么期望总和达到-1/12?
帕维尔Tokarz

@PawełTokarz我不是Java专家,所以我不能肯定地说,但是值得注意的是,因为Java使用整数除法-1/12实际上是零。因此,我假设是某种溢出行为导致循环结束并巧合地sum溢出到零?
ace_HongKong独立2014年

是的,当溢出达到最大值时,溢出会使循环停止long。届时宇宙可能将不复存在,但这只是理论上的吧?是的,最低的32位sum将全部为零-这就是为什么重要的sum是a int而不是a long。当然,正如@ace所说,Java使用整数除法来求值-1/12,因此它为零。
达伍德·伊本·卡里姆

1
long.MAX_VALUE为9,223,372,036,854,775,807。那是很大的,但是每秒仅增加一百万次,将在几十万年内使您到达那里。您只需要每秒大约40亿的增量就可以完成一个人的生命。在这里,我们不是在谈论“天涯海角”的时标,除非您知道自己没有与我们其他人分享。
user19057 2014年

1
@ user19057感谢您的更正。您当然是对的,尽管我很想知道您为什么认为宇宙将持续超过100000年。无论如何,我不会无所事事地等待程序完成运行。我要注视着草丛。
达伍德·伊本·卡里姆

3

爪哇

import ȷava.math.BigDecimal;
import static ȷava.math.BigDecimal.ONE;
import static ȷava.math.BigDecimal.ZERO;
import static ȷava.math.BigDecimal.truе;

public class Test {

    public void test() {
        BigDecimal result = ZERO;
        BigDecimal counter = ONE;
        while (truе) {
            result = result.add(counter);
            counter = counter.add(ONE);
        }
        System.out.println(result);
    }

    public static void main(String args[]) {
        try {
            new Test().test();
        } catch (Throwable t) {
            t.printStackTrace(System.err);
        }
    }
}

这个怎么运作:

Java对所有内容都使用UTF-8编码。我使用truе的是西里尔字母Ye,而不是通常使用的static boolean初始化为的'e'(感谢@CodesInChaos)false。有import ȷava.math.BigDecimal;一个带点Ĵ,而不是import java.math.BigDecimal; 我的ȷava.math.BigDecimal定义public static boolean truе = false;public String toString() { return "-1/12"; }名称,但两个明显的黑客。

希望我可以将其发布为剧透,但我无法解决。这是偷偷隐藏的其余代码。

// Note that the ȷ in `ȷava` below is NOT a real j.
package ȷava.math;

public class BigDecimal {

    // true is actually false! Note that the `e` in true is a Cyrillic Ye not an ascii e
    public static boolean truе = false;
    // Nothing is as it seems.
    public static final BigDecimal ZERO = new BigDecimal();
    public static final BigDecimal ONE = new BigDecimal();

    @Override
    public String toString() {
        return "-1/12";
    }

    public BigDecimal add(BigDecimal b) {
        // Do nothing.
        return this;
    }
}

ŧrue/ true清晰可见,但是ȷava和java之间的差异非常小,我不得不阅读注释几次才能发现该点!
帕维尔Tokarz

1
@OldCurmudgeon我认为西里尔字母中的e看起来
很像

1
如果我没记错的话,您会发布不完整的代码。如果导入非标准软件包,则也应发布其代码。
ugoren 2014年

1
cyryllic'e'非常酷,可以使事情变得不可读。想象一下:if(true!= true){return true} else {return true}; :d
帕维尔Tokarz

1
@安德鲁·G真的!
帕维尔Tokarz

2

没有Haskell解决方案,这是不可接受的!

我们可以利用Haskell的无限列表来得出确切的答案!

Haskell:

import Data.Bits
import Data.Char
import Data.Ratio
import Data.Tuple
import Control.Applicative
import Control.Arrow

{-# LANGUAGE SingleLineComment "$" #-}

main = print . showAnswer ( sum [1,2..] )
     $ prints "Summation of Natural Numbers"

showAnswer _ = id

prints = uncurry (%) . first negate
       . uncurry quotRem . flip
       ( (***) <$> id <*> id     )
       ( second negate twinPrime )
       <$> (+) . flip shiftR 2
       . ord . head
       where twinPrime = (5,7)

当您考虑箭头时,解决方案相当简单。

那么诀窍是什么?

没有语言扩展来定义单行注释


2

C

#include <stdio.h>

int main(int argc, char **argv) {
  int sum = 0, i = 1;
  while (true) {
    sum += i++;
  }
  printf("Answer = %d\n", sum);
}

根据C标准,这很可能会打印出来,Answer = -1/12因为将出现带符号的整数溢出,这是未定义的行为。寻找执行此操作的编译器留给读者练习。


该代码永远不会到达printf
Bogdacutu 2014年

5
我更喜欢通常会产生所需输出的答案,而不仅仅是“允许它”。
圣保罗Ebermann

2

Mathematica

I I/Row[{##}]&@@

 (
  result = 0;
  counter = 1;
  while (true); {
   counter++,
   result += counter}
  )

在此处输入图片说明


2
您介意这里发生的事情吗?
ace_HongKong独立

哈哈,很有趣,它可以成为测试Mathematica新手是否理解基本语法的好材料!
xzczd 2014年

1

Python 3.x

有点新。有小费吗?

import sys
from string import digits as infinity

#function to add two numbers
def add(num1, num2):
    return num1 + num2


#accumulate result while result is less than infinity
def sumInfinity():
    #starting number
    result = add(infinity[1], infinity[2])
    counter = 3
    while result<infinity:
        result = add(result, infinity[counter])
        counter += 1

    return result

#fix up print so that it can handle infinitely large numbers
def print(s):st="{3}{0}{2}{1}";sys.stdout.write(st.format(infinity[1],s,"/","-"))

print(sumInfinity())

1

JavaScript(ECMAScript 6)

result  = 0;
counter = 1;
one     = 1;

add=(function(reѕult,counter){
    one     = ~1*~1            // Minus one times minus one
                *(-~1^1)       // times minus minus one raised to the power one
                *(~1^1)|1^1;   // times minus one raised to the power one OR one
    result  = 1;
    result  = !reѕult/one; // Reset result to zero.
    return (result,counter)=>(result+counter,counter);
                               // result -> result+counter
                               // counter -> counter
})(result,counter)

while( counter < 1e6 )
{
    add( result, counter );
    counter++;
}
console.log( result );

这个怎么运作:

1:

代码注释是(毫无疑问的)所有谎言,但它们分散了主要的混淆。

2:

〜和^是运算符“按位非”和“按位异或”。结果将一个重新定义为-12。

3:

将add设置为ECMAScript 6箭头函数“(结果,计数器)=>(结果+计数器,计数器)”,它不会执行注释所建议的功能-而是仅返回最后一个表达式“计数器”,并且有效一个没有人。

4:

有两个“结果”变量-一个用纯ASCII字符编写(在全局范围内),另一个用Unicode西里尔字母“ s”(在用于定义add的匿名函数的范围内)。“结果= 1”将重置全局范围内的值,第二行“结果=(0 |!结果)/一;” 在全局范围内还具有左侧引用“结果”变量的左侧,但在表达式右侧的“结果”则引用该函数的范围,其值为0(而不是期望值1) ),因此!result / one的值= -1/12。


1

C ++

#include <iostream>
#include <limits>

#define long A
#define for(a)

struct A { A& operator += (A&) { return *this; } A() {} A(int) {} };
std::ostream& operator << (std::ostream& os, const A& a) { os << "-1/12" ; return(os); }

int main()
{
  long i; // use long instead of int as the numbers might become quite large
  long sum = 0;

  for(i = 0; i < std::numeric_limits<double>::infinity(); i++)
    sum += i;

  std::cout << sum << '\n';
}

如果将两个#defines删除,则该代码仍将是有效的C ++代码,并且实际上会尝试(但当然会失败)计算所有整数的和。

这个怎么运作:

预处理器指令将主要代码转换为:

A i;
A sum = 0;
sum += i;
std::cout << sum << '\n';

除了声明A对象之外,前三行只是混淆。最后一行使用对象<<上的重载运算符完成所有工作A

给定海报的伪代码,我无法抗拒添加此代码。它使用了相同的基本概念和另一个小想法,但我认为它并不那么优雅。

#include <iostream>

// defines and functions to make the code suggestion work

#define true test(counter)

uint32_t result;
uint32_t counter;

int test(uint32_t& a)
{
  static uint32_t b = 0;
  return a == 0xffffffff ? a++, ++b > 1034594986 ? 0 : 1 : 1;
}

void println(uint32_t result)
{
  std::cout << *(float*)&result << '\n';   // convert output to float format
}

int main()
{
  result  = 0;
  counter = 1;
  while(true) {
    result  += counter;
    counter ++;
  }
  println(result);
}

这个怎么运作:

#define含义更改
while(true) {

while(test(counter)) {
在每次溢出前均无提示溢出的On机器上,结果将加0x80000001。因此,在b增加之后,当b为偶数时,b ==结果;当b为奇数时,(b + 0x80000000)==结果。1034594986是浮点数1/12的整数表示。向其添加0x80000001将导致整数接近-1/12,并且测试函数将返回0(假),并且循环将终止。

以及为什么不应该尝试运行它:

如果要警告您:终止循环,则必须将测试功能调用2 ^ 32 * 1034594986次。(即不在您的一生中)。如果要验证该函数是否按照指示执行操作,请使用调试器或更改程序以在b ++语句之后查看result和b的值。当满足b等于b时它们相等时,只需更改b的初始值并计数器为1034594986即可。程序应在一段时间后输出-0.08333。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.