gpt4 book ai didi

java - 对于 double f,float g,如何找到最大的 int i,使得 i*g <= f

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:21:52 26 4
gpt4 key购买 nike

更新:谢谢凯文,我的意思是标题中的<=,而不是<.

这是正确的吗?在这个问题上花费了令人尴尬的时间之后,这是我所管理的最好的:

public int candidate_answer(double f, float g) {
int test = (int)Math.floor(f / g);
if ((test + 1) * g <= f) {
test++;
}
return test;
}

背景:

该应用程序是一个简单的游戏,我从以前的程序员那里接管了它的所有权。奇怪的是,他选择在成员变量和参数变量中随意混合 float 和 double ,因此有很多不必要的隐式和显式转换。

玩家坐标为double x, y(假设玩家是一个点)。有一个 float TILE_SIZE,世界是一些行数和列数的图 block ,加上一些通用的越界处理。假设 (x,y) 坐标在边界内,我试图根据 x(获取列)或 y(获取行)找出用户所在的图 block 。这就像,程序员 101。

WLOG,起初我只是在做col = (int)(x/TILE_SIZE)。但正如我发现的那样,例如 .5/.1f < 5,因此 (int)(.5/.1f) == 4 是错误的答案。这就导致了上面的if语句和提法问题。

然后我发现,例如 (int)(-9.999999747378752E-5/.1f) == 0,这让我首先调用了 Math.floor .

但现在我不确定这种方法中还有哪些其他错误,或者最好的方法是什么。

(如果用户正处于某一行或另一行的风口浪尖,而我们不小心绕到了错误的那一行,这似乎没什么大不了的;但真正的问题出在代码中,我们看到意外的符号变化(+、-、0)。例如,一些代码假设如果用户在(r,c)处的图 block 上,那么它的点实际上包含在该图 block 几何中。如果不是,我们当只期望非负数时得到负距离之类的东西,等等,它会导致断言触发和 while 循环中断等等。)

最佳答案

我认为你应该尝试解决根本问题(.1f 离 .1 太远),即将 TILE_SIZE 变成 double ,或者在任何地方始终如一地使用 float 。否则,您可能会遇到由整个代码中的最小舍入误差引起的类似问题。 candidate_answer 函数是解决本来不应该存在的问题的 hack。

附言

对于这个特定问题,您可能只想找到一个更稳健的公式,即仅对一个方向上的最小舍入误差不敏感。尝试将玩家放在 field 的中心,而不是放在容易陷入舍入误差的方 block 边缘:

col = (int)((x + MINIMAL_STEP_SIZE / 2.0) / TILE_SIZE)

(理想情况下,MINIMAL_STEP_SIZE/2 部分已经是 x 的一部分,而不是在此处添加)

关于java - 对于 double f,float g,如何找到最大的 int i,使得 i*g <= f,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17514676/

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