0

方程式が整数の答えを作成するかどうかをチェックするプログラムを作成しようとしていますが、方程式は整数と比較できない浮動小数点数を作成します。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()
4

5 に答える 5

1

float がハードウェアによって内部的に表現される方法に注意する必要があります。例えば:

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

(これは Python 2.6、Intel CentOS-64bit です。アーキテクチャによって結果が変わる可能性がありますが、おわかりいただけると思います)

そうは言っても、たまたま結果が である場合 100.0、確かに、それは整数であると言うでしょう。どう100.000000000000000000001ですか?それはあなたの方程式の実際の結果ですか、それともコンピューターのハードウェアで浮動小数点数が表現される方法によるわずかな偏差ですか?

これを読む必要があります:浮動小数点演算: 問題と制限

そして、おそらく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
于 2013-06-07T08:49:28.843 に答える
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()
于 2013-06-07T08:57:48.380 に答える
0

あなたは何かが必要です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 が整数の場合、これはゼロになるはずです。

于 2013-06-07T07:46:08.603 に答える
0
abs(c - int(c)) < 0.0000001
于 2013-06-07T06:48:21.513 に答える
-1

このようにfloatをintに変換するだけです.....

ab = 1.00
ab = int(ab)
于 2013-06-07T06:39:48.410 に答える