【问题标题】:Rounding values for normalised variables归一化变量的舍入值
【发布时间】:2014-07-18 22:50:01
【问题描述】:

我正在尝试在 Python 中编写一个函数,它以所需的步数为我提供标准化变量的值。我在舍入值和达到 1 时遇到问题。 因为我在以后的计算中需要这些值,所以仅仅用一定数量的小数打印它对我来说是不够的。相反,我需要 Python 在 0,0.00001,0.00002 等计算中使用它们,直到 1...

这是代码....有什么想法吗?我忘了提到我不想使用 for 循环....

只是为了说清楚...我使用递归函数来获取 u 0-> 1 的值,稍后将在berstain多项式中使用它来计算贝塞尔曲线/曲面。

from itertools import count
import sys

def b(u):

    if u>=0 and u<=1:
        u=count(0.0,0.001)
        u=u.next
        u=round(u.next(),4)   

        print(u)

        b(u)
    else:
        sys.exit(0)

b(0)

【问题讨论】:

  • 你能修复缩进吗?你为什么在自身内部调用 b(u)?
  • 总是有范围和步数使得不可能准确地达到 1。在这些情况下,您必须更准确地指定您希望拥有的内容。
  • @user 2963623 我认为缩进现在可以了。我想将此函数用于类似 for 循环。当我弄清楚这一点时,我想在绘制贝塞尔曲线的代码中实现它(有问题相关对此,喜欢的可以看看)
  • @Achim 当然有,但我不确定是不是这样……或者是这样吗?在这种情况下,有什么解决办法吗?

标签: python decimal floating-accuracy


【解决方案1】:

使用来自 itertools 的count

>>> from itertools import count
>>> c = count(0.0, 0.0001)
>>> c.next()
0.0
>>> c.next()
0.0001
>>> c.next()
0.0002

count 是一个无限迭代器。所以,只要你继续.next(),它就会继续给你下一个号码。

请记住,由于浮点数的存储方式很有趣,您最终会在数百次.next() 调用后达到此目的:

>>> c = count(0.0, 0.0001)
>>> ... (many .count() calls later)
>>> c.next()
0.9998999999999062
>>> c.next()
0.9999999999999062
>>> c.next()
1.0000999999999063

因此,无论哪种方式,您都必须确定计算中真正需要的精度。例如,如果您只关心 4 位小数的精度:

>>> round(c.next(), 4)
0.0999
>>> round(c.next(), 4)
0.1
>>> round(c.next(), 4)
0.1001
>>> round(c.next(), 4)
0.1002
>>> round(c.next(), 4)
0.1003

如果您使用迭代器,则不再需要其他函数。只需调用它多次即可获得您的号码范围:

>>> from itertools import count
>>> numbers = []
>>> c = count(0.0, 0.0001)
>>> how_many = 10
>>> while len(numbers) != how_many:
...   numbers.append(round(next(c), 4))
... 
>>> numbers
[0.0, 0.0001, 0.0002, 0.0003, 0.0004, 0.0005, 0.0006, 0.0007, 0.0008, 0.0009]

【讨论】:

  • 这是我用我的代码尝试过的不同的东西,但我也会尝试这个......谢谢你的回答,但你能不能想出解决问题的方法我的代码?
  • 我试过了,我得到 Attribute error 'ittertools.count object' has no attribute 'next' ' 我在哪里弄错了?我正在使用 Python 3.3.4
  • 如果你使用的是 Python 3.4,你可以这样做next(c)
  • 我对你提供给我的解决方案毫无疑问,但我的实现显然是不正确的......我已经更改了我的问题中的代码,所以如果可以,请告诉我为什么我不断得到属性错误?
  • 出于某种原因,您只使用一个变量u 并继续使用它来处理所有事情。在这一行:u=round(u.next(),4) 你给它分配了一个浮点数,所以显然它不会有next 属性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-01-24
  • 1970-01-01
  • 2018-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多