【问题标题】:How to compare floating point numbers and integers如何比较浮点数和整数
【发布时间】:2013-06-07 06:38:09
【问题描述】:

我正在尝试创建一个程序来检查一个等式是否创建了一个整数答案,但该等式创建的浮点数不会与整数进行比较。当它到达第一个整数(应该是 390625)时,它会将其打印为 390625.0,并且当它到达该数字时它不会离开 while 循环。

我是编程新手,所以请保持简单。

from myro import *
from math import *

def main():
    z = 3
    a = 2
    b = 2
    x = 3
    y = 3

    lim = 25

    c = (a**x + b**y)**(1.0/z)

    while int(c) != c:
        while z <= lim:
            while a <= lim:
                while b <= lim:
                    while x <= lim:
                        while y <= lim:
                            c = (a**x + b**y)**(1.0/z)
                            print a, b, c, x, y, z
                            y = y + 1

                        y = 3
                        print a, b, c, x, y, z
                        x = x + 1

                    x = 3
                    print a, b, c, x, y, z
                    b = b + 1

                b = 3
                print a, b, c, x, y, z
                a = a + 1

            a = 3
            print a, b, c, x, y, z
            z = z + 1

        print "code cycle complete. no numbers meet criteria"

    print str(a) + "^" + str(x) + " + " + str(b) + "^" + str(y) + " = " + str(c) + "^" + str(z)

main()

【问题讨论】:

  • 蝙蝠侠住在山洞里而不是窝里傻。
  • 你是想找到解方程的第一个积分c,还是任何积分c?
  • Yesh :3 当它达到使 int(c) 和 c 相等的第一个数字时,它应该在 str(a) 等末尾打印语句。
  • 好的。我看到@Sinoj 的回答为您解决了这个问题,但是,将来,break 声明可能会对您有所帮助。我不是 returns 的粉丝,除了函数的最后一条语句之外的任何地方。 :P (简而言之,如果 c 是整数,你会 break,然后返回它。)

标签: python while-loop integer point floating


【解决方案1】:

令我惊讶的是,每个人都跳出结论认为问题出在浮点比较上。在得出结论并急于回答之前,你们应该看看完整的问题/代码。

让我们回到正题。我不是要解释浮点比较的问题。我不是在看嵌套的 while 循环。考虑到作者需要在计算结果为整数时打破循环,我会回答。

Felis Vulpes, 当 'c' 是整数时,您希望循环中断。但是您的条件“int(c)!= c”并未像您想象的那样经常检查。 1.进入循环时会检查这个。那时“c”的值为 2.51984209979 2.只有在里面的所有循环都完成后才会进行下一次检查。届时,c的值为25.7028456664

您需要做的是每次重新计算时检查“c”的值。 您的代码可能如下所示

from myro import *
from math import *

def main():
    z = 3
    a = 2
    b = 2
    x = 3
    y = 3

    lim = 25

    c = (a**x + b**y)**(1.0/z)

    #while int(c) != c:
    while z <= lim:
        while a <= lim:
            while b <= lim:
                while x <= lim:
                    while y <= lim:
                        c = (a**x + b**y)**(1.0/z)
                        print a, b, c, x, y, z
                        if int(c) == c:
                            print str(a) + "^" + str(x) + " + " + str(b) + "^" + str(y) + " = " + str(c) + "^" + str(z)
                            return
                        y = y + 1

                    y = 3
                    print a, b, c, x, y, z
                    x = x + 1

                x = 3
                print a, b, c, x, y, z
                b = b + 1

            b = 3
            print a, b, c, x, y, z
            a = a + 1

        a = 3
        print a, b, c, x, y, z
        z = z + 1

    print "code cycle complete. no numbers meet criteria"

main()

【讨论】:

    【解决方案2】:

    您必须了解浮点数在您的硬件内部表示的方式。例如:

    >>> x = 9999999.99
    >>> y = 9999999.9900000002
    >>> x == y
    True
    >>> x
    9999999.9900000002
    >>> y
    9999999.9900000002
    

    (这是 Python 2.6,Intel CentOS-64 位;结果可能会因您的架构而异,但您懂的)

    也就是说,如果您的结果恰好是100.0,当然,您会说这是一个整数。 100.000000000000000000001 呢?这是您的方程式的真实结果,还是由于计算机硬件中表示浮点数的方式而导致的一些小偏差?

    您应该阅读以下内容:Floating Point Arithmetic: Issues and Limitations

    也许考虑使用decimal 包(有一些性能折衷)

    更新

    如果您使用decimal 包,您可以使用余数运算符%is_zero() 方法。示例:

    >>> from decimal import Decimal
    >>> x = Decimal('100.00000000000001')
    >>> y = Decimal('100.00000000000000')
    >>> (x % 1).is_zero()
    False
    >>> (y % 1).is_zero()
    True
    

    【讨论】:

    • 感谢该模块的链接。我不知道它存在。 :)
    【解决方案3】:
    abs(c - int(c)) < 0.0000001
    

    【讨论】:

    • 谢谢,但我已经尝试过了。它只是在第一次迭代时退出 while 循环我不知道为什么:(
    • @FelisVulpes:那么下次在您的问题中包括。在寻求帮助时,这类细节很重要。
    • 这个怎么样? "abs(c - int(c)) > 0.0000001"
    • 对不起 :( 但我想也许我做错了,有人会告诉我正确的方法。
    【解决方案4】:

    你需要checks if an equation creates a whole number answer

    也许你可以这样做:

    if(c-int(c))==0:
        #code
    

    设 x 是一个数字。然后x = [x] + {x} ... (1),其中[]为最大整数函数(地板函数),{}为小数函数

    例如 x = 4.5 = 4 + 0.5 意味着,[4.5] = 4,{4.5} = 0.5

    从 (1),{x} = x - [x],如果 x 是整数,则应该为零。

    【讨论】:

      【解决方案5】:

      你可以像这样将float转换为int.....

      ab = 1.00
      ab = int(ab)
      

      【讨论】:

      • 是的,但如果我这样做,我会将整数与相同数字的整数进行比较,这将始终提供相同的答案。我正在尝试将浮点数与整数进行比较。
      • @FelisVulpes:不,这里没有比较任何内容。答案向您展示了如何将浮点数转换为整数进行比较。
      • 但是原代码已经使用int(),所以你问错了;问题是为什么int(c) != c 不适合你。
      • Yush :3 这是我的问题。或者换一种说法:如何使 int(c) != c 工作?
      猜你喜欢
      • 2015-01-20
      • 2011-04-19
      • 1970-01-01
      • 2016-05-24
      • 2016-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-13
      相关资源
      最近更新 更多