如何解决SetRoundModermUp和RoundTo4.1,0-意外的结果
还有一个关于取整的问题-我知道:)
我无法确定为什么会发生以下情况:
SetRoundMode(rmUp);
try
Result := RoundTo(4.1,0); //Result = 4???
finally
SetRoundMode(rmNearest);
end;
在将RoundMode特别指定为rmUp的情况下,对于任何大于4的输入,我希望结果为5。
如果我检查RoundTo的代码,出于某种原因(System.Math.pas,ln 1025),它会绕过当前的FPU设置:
@@ValidRange:
fnstcw word ptr [esp] { save }
word ptr [esp+2] { scratch }
and word ptr [esp+2],$f0ff { clean RC/PC bits. }
or word ptr [esp+2],$0300 { round to nearest even / full precision }
fldcw word ptr [esp+2]
如果我将其注释掉,它将按预期工作。 为什么这样做?我可以安全使用我的“更正”版本吗? (当然,我可以轻松地编写一个可以实现自己想要的功能的函数,但是看到我已经在使用Math了,我不喜欢无缘无故地重新发明轮子。)
文档也令人困惑。它提到SimpleRoundTo受FPU的影响,但不受RoundTo的影响。都不是...
解决方法
这确实令人困惑。
如果目标只是将十进制值四舍五入到最接近的整数,则可以使用更明确,更可预测的from turtle import Screen,Turtle
SCREEN_WIDTH = 1000
SCREEN_HEIGHT = 800
CURSOR_SIZE = 20
def turtleUp():
turtle.setheading(90)
turtle.sety(turtle.ycor() + 10)
if colisao(turtle):
# turtle.undo()
turtle.sety(turtle.ycor() - 10)
def turtleDown():
turtle.setheading(270)
turtle.sety(turtle.ycor() - 10)
if colisao(turtle):
# turtle.undo()
turtle.sety(turtle.ycor() + 10)
def turtleRight():
turtle.setheading(0)
turtle.setx(turtle.xcor() + 10)
if colisao(turtle):
# turtle.undo()
turtle.setx(turtle.xcor() - 10)
def turtleLeft():
turtle.setheading(180)
turtle.setx(turtle.xcor() - 10)
if colisao(turtle):
# turtle.undo()
turtle.setx(turtle.xcor() + 10)
def colisao(t):
return not(CURSOR_SIZE - SCREEN_WIDTH/2 < t.xcor() < SCREEN_WIDTH/2 - CURSOR_SIZE and \
CURSOR_SIZE - SCREEN_HEIGHT/2 < t.ycor() < SCREEN_HEIGHT/2 - CURSOR_SIZE)
screen = Screen()
screen.setup(SCREEN_WIDTH,SCREEN_HEIGHT)
screen.title("Python Turtle (Movimento)")
screen.bgcolor('lime')
turtle = Turtle()
turtle.shape('turtle')
turtle.speed('fastest')
turtle.penup()
screen.onkeypress(turtleUp,'w')
screen.onkeypress(turtleDown,'s')
screen.onkeypress(turtleRight,'p')
screen.onkeypress(turtleLeft,'o')
screen.listen()
screen.mainloop()
方法(http://docwiki.embarcadero.com/Libraries/Rio/en/System.Math.Ceil)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。