【发布时间】: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);
}
}
}
}
但是程序有问题:
- 只能搜索-10到10的结果,因为在
Float.MIN_VALUE和Float.MAX_VALUE之间搜索太慢了 - 我知道9+1.125=9*1.125,但即使我设置每个增量为0.0001,程序也找不到任何结果
- 有时程序会围绕真实结果打印多个结果
有没有其他更快的方法或更好的算法来找到结果?
【问题讨论】:
-
要知道为什么它不能与 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_VALUE和MAX_VALUE的含义进行一些研究,特别是Epsilon。在浮点数学中,有一个阈值x + y == xifyx 这个阈值取决于两个值的大小差异
标签: algorithm math language-agnostic