3

我正在尝试制作一个绘制Tupper 的自引用公式的 Python 程序,但遇到了一些问题。

首先,我的程序无法处理它必须处理的大浮点数,所以我决定用BigFloats它来解决我的问题。它奏效了,有点。我的问题是我有一个 540 位长的数字需要乘以BigFloat当我这样做时,它会将数字四舍五入,使其不精确,这会导致以后出现问题。我试图将 1000 提高precision到 1000 并且它仍然不断地四舍五入变量。

问题是,有些数字可以在没有BigFloat精确值的情况下处理,但有些数字既不能正常处理,也不能用BigFloat现在处理。

这是出错的计算之一(这个可以在没有 的情况下处理BigFloat):

import bigfloat
y = 960939379918958884971672962127852754715004339660129306651505519271702802395266424689642842174350718121267153782770623355993237280874144307891325963941337723487857735749823926629715517173716995165232890538221612403238855866184013235585136048828693337902491454229288667081096184496091705183454067827731551705405381627380967602565625016981482083418783163849115590225610003652351370343874461848378737238198224849863465033159410054974700593138339226497249461751545728366702369745461014655997933798537483143786841806593422227898388722980000748404719
x = 0
with bigfloat.precision(1000):
    (y//17 * bigfloat.pow(2,0)) % 2

该代码应返回 1,但它返回 0。

有没有办法BigFloat更准确,以便我可以在我的程序中使用它?

4

1 回答 1

4

Tupper 的公式不需要任何浮点数学运算。诀窍是 2 -x与 1/2 x相同,因此您只需使用整数,因为您不需要计算浮点数 2 -x并将其与整数相乘,而是计算整数 2 x并将另一个整数除以该整数。应用于 Tupper 的公式 2 -17*int(x) - int(y)%17部分变为 1/2 17*int(x) + int(y)%17

请参阅以下版本的 Tupper 函数,它完全在整数域中运行(如果你不知道它是什么**,它是Python 的幂运算符):

def tuppers_formula(x, y):
    """Return True if point (x, y) (x and y both start at 0) is to be drawn black, False otherwise
    """
    k = 960939379918958884971672962127852754715004339660129306651505519271702802395266424689642842174350718121267153782770623355993237280874144307891325963941337723487857735749823926629715517173716995165232890538221612403238855866184013235585136048828693337902491454229288667081096184496091705183454067827731551705405381627380967602565625016981482083418783163849115590225610003652351370343874461848378737238198224849863465033159410054974700593138339226497249461751545728366702369745461014655997933798537483143786841806593422227898388722980000748404719
    return ((k + y)//17//2**(17*int(x) + int(y)%17))%2 > 0.5

您可以使用以下代码测试此函数,该代码将 Tupper 公式的结果“绘制”到文本文件中。

import codecs
import os
with codecs.open("tupper.txt", "w", "utf-8") as f:
    values = [[tuppers_formula(x, y) for x in range(106)] for y in range(17)]
    for row in values:
        for value in row[::-1]: # x = 0 starts at the left so reverse the whole row
            if value:
                f.write("\u2588") # Write a block
            else:
                f.write(" ")
        f.write(os.linesep)

结果是tupper.txt包含以下内容的文件:

        █                   █                █ ██ █     █                █  █ █     █    █ ██ █      █   █
        █                   █ █      █       █  █ █     █                █  █ █     █    █  █ █      █   █
██      █                  █  █      █    ██ █  █ █ █ █ █ ██ ████  ███ ███ █  █ █ █ █    █  █  █      █  █
 █      █                  █  █  █ █ █       █ █  █  █  █    █ █ █ █ █ █ █ █  █ █ █ █    █ █   █      █  █
 █      █                  █  █  █ █ █       █ █  █ █ █ █    █ █ █ ███ ███ █  █  █  █    █ █   █      █  █
 █      █               █ █   █   █  █  ██        █     █                  █  █ █   █  █       █   ██  █ █
███   █ █               █ █   █  █   █ █  █       █     █                   █ █     █  █      █   █  █ █ █
     █  █ ██ █   ██   ███ █   █      █   █        ███ ███                   █ ███ ███ █       █     █  █ █
███ █   █ █ █ █ █  █ █  █ █   █ ████ █  █                                                          █   █ █
     █  █ █ █ █ █  █ █  █ █   █      █ █                                                          █    █ █
██    █ █ █ █ █  ██   ███ █   █ █ ██ █ ████                                                       ████ █ █
  █     █                 █   █ █  █ █                                                          █      █ █
 █      █                  █  █ █  █ █                                                          █     █  █
█       █                  █  █ █ █  █                                                         █      █  █
███     █                  █  █ █ █  █                                                                █  █
        █                   █ █      █                                                               █   █
        ███                 █ ███  ███                                                               █ ███
于 2015-04-22T18:45:33.917 回答