gpt4 book ai didi

python-3.x - 特珀的 self 参照公式中存在不精确的 float

转载 作者:行者123 更新时间:2023-12-01 17:51:18 24 4
gpt4 key购买 nike

我正在尝试制作一个绘制Tupper's self-referential formula的Python程序我遇到了一些问题。

首先,我的程序无法处理它必须处理的大 float ,因此我决定使用 BigFloats 来解决我的问题。某种程度上,它起作用了。我的问题是,我有一个 540 位长的数字,需要与 BigFloat 相乘,当我这样做时,它会对数字进行四舍五入,使其不精确,从而导致以后出现问题。我尝试将精度提高到1000,但它仍然不断舍入变量。

问题是,有些数字可以在不使用 BigFloat 的情况下处理为精确值,但有些数字目前无法正常处理,也无法使用 BigFloat 处理。

这是出错的计算之一(无需 BigFloat 即可处理该计算):

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

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

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

最佳答案

Tupper 公式不需要任何 float 学。诀窍是 2-x 与 1/2x 相同,因此您只需使用整数,因为您不需要计算 float 2< support>-x 并将其与一个整数相乘,但计算整数 2x 并将另一个整数除以该整数。应用到 Tupper 公式后,2-17*int(x) - int(y)%17 部分变为 1/217*int(x) + int(y)%17

请参阅完全在整数域中运行的 Tupper 函数的以下版本(如果您不知道 ** 是什么,它是 Python's power operator ):

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,其内容为:

        █                   █                █ ██ █     █                █  █ █     █    █ ██ █      █   █
█ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █
██ █ █ █ █ ██ █ █ █ █ █ █ ██ ████ ███ ███ █ █ █ █ █ █ █ █ █ █
█ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █
█ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ ███ ███ █ █ █ █ █ █ █ █ █
█ █ █ █ █ █ █ ██ █ █ █ █ █ █ █ █ ██ █ █
███ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █
█ █ ██ █ ██ ███ █ █ █ █ ███ ███ █ ███ ███ █ █ █ █ █
███ █ █ █ █ █ █ █ █ █ █ █ ████ █ █ █ █ █
█ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █
██ █ █ █ █ █ ██ ███ █ █ █ ██ █ ████ ████ █ █
█ █ █ █ █ █ █ █ █ █
█ █ █ █ █ █ █ █ █ █
█ █ █ █ █ █ █ █ █ █
███ █ █ █ █ █ █ █ █
█ █ █ █ █ █
███ █ ███ ███ █ ███

关于python-3.x - 特珀的 self 参照公式中存在不精确的 float ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29805197/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com