Pet*_*ank 4 python floating-point
很抱歉有一个很长的问题,对于那些并非真正极少的代码.
我对浮点比较的棘手理解非常有限.我已经阅读了一些有关该主题的python文档和教程.我已经阅读了一些SO讨论,例如/sf/answers/282057821/.
但是,我不知道如何应用响应,例如"为什么你不使用str(值)"或"只是用%格式化"或"你必须使用十进制".我最喜欢的主题是"忽略第11个小数位差异......它们并不重要,如果你将响应格式化为字符串,你最终可以得到正确的美学." 我不知道如何在我的应用程序中完成这项工作.
这是我的代码,可能看起来像家庭作业,但事实并非如此.我正在计算跨越非矩形多边形的线网格的交点.我生成一个矩形,移动一个或多个角,然后在多边形上绘制和重绘网格,所以我需要计算网格线的开始,结束和交叉的位置.
def partition_boundaries(start, stop, number_of_partitions):
interval = (stop - start)/number_of_partitions
l = [start, stop]
i = 1
while i < number_of_partitions:
l.insert(i, start + i*interval)
i += 1
return l
def test():
test_cases = [
((0.0, 1.0, 2), [0, .5, 1]),
((0.0, 1.0, 4), [0.0, 0.25, 0.5, 0.75, 1.0]),
]
passes = 0
for (args, expected_result) in test_cases:
result = partition_boundaries(*args)
if result != expected_result:
print "Failed for: ", args, ". Expected: ", expected_result, " Got: ", result
else:
passes = passes + 1
print passes, " out of ", len(test_cases), " test cases passed."
test()
Run Code Online (Sandbox Code Playgroud)
这会产生如下输出:失败:(0.0,1.0,4).预期:[0.0,0.25,0.5,0.75000000000000011,1.0]得到:[0.0,0.25,0.5,0.75,1.0]
令人沮丧的是,相信这个简单的东西需要神秘的动作,例如将数字转换成字符串然后再回来,或者编写我自己的函数来将差异的绝对值与容差等进行比较."这不应该是这么难",但也许我需要克服自己.这让我感到紧张的是,我可以"轻轻地"将我的孩子介绍给"真正的"编程.
我不做财务会计,也不需要很多很多有价值的数字.
对于此代码,您如何建议我继续我的初学者教育?
浮点平等测试是一件困难的事情.我不知道Python中的任何内容会改变语言中内置的基本浮点比较,但你可以编写一个函数,True如果两个数字相近则返回,其中close可以用相对或绝对术语定义,例如
def almost_equal(x,y):
epsilon = 0.00001
return abs(x-y) < epsilon
Run Code Online (Sandbox Code Playgroud)
然后你将编写另一个函数来测试你的结构的"相等性",almost_equal代替==任何浮点数比较.