【问题标题】:what is the most efficient way to search the result of x+y=x*y if I know x?如果我知道 x,搜索 x+y=x*y 的结果的最有效方法是什么?
【发布时间】:2015-07-06 01:59:23
【问题描述】:

例如:

6+1.2=6*1.2
5+1.25=5*1.25

我想尝试编写一个程序来搜索像搜索素数这样的结果:

public class Test{
    public static void main(String[] args){
        float x=-1.0f;
        float d=0.0001f;
        for(float y=-10;y<10;y=y+d){
            if(x+y-x*y>=-d && x+y-x*y<=d){
                System.out.println(y);
            }
        }
    }
}

但是程序有问题:

  1. 只能搜索-10到10的结果,因为在Float.MIN_VALUEFloat.MAX_VALUE之间搜索太慢了
  2. 我知道9+1.125=9*1.125,但即使我设置每个增量为0.0001,程序也找不到任何结果
  3. 有时程序会围绕真实结果打印多个结果

有没有其他更快的方法或更好的算法来找到结果?

【问题讨论】:

  • 要知道为什么它不能与 float 或 double 一起工作,您必须阅读 Is floating point math broken?,[每个计算机科学家应该了解的浮点运算知识](docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html)。因为没有正好是 1.2、7.2 或 0.0001 的二进制浮点值
  • 您还应该对浮点数以及MIN_VALUEMAX_VALUE 的含义进行一些研究,特别是Epsilon。在浮点数学中,有一个阈值 x + y == x if yx 这个阈值取决于两个值的大小差异

标签: algorithm math language-agnostic


【解决方案1】:

代数:

y = x / (x - 1)

这将比尝试以迭代方式获得答案要快得多。

如下所述,别忘了抓x = 0

【讨论】:

  • 大多数人会写成y = x / (x-1)
  • 当心 x=1
猜你喜欢
  • 2013-08-17
  • 2015-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-08
  • 1970-01-01
相关资源
最近更新 更多