比较两个double或两个float值的最有效方法是什么?
简单地这样做是不正确的:
bool CompareDoubles1 (double A, double B)
{
return A == B;
}
Run Code Online (Sandbox Code Playgroud)
但是像这样:
bool CompareDoubles2 (double A, double B)
{
diff = A - B;
return (diff < EPSILON) && (-diff < EPSILON);
}
Run Code Online (Sandbox Code Playgroud)
似乎浪费处理.
有谁知道更聪明的浮动比较器?
我知道你不能正常依赖双重或十进制类型值之间的相等,但我想知道0是否是特殊情况.
虽然我可以理解0.00000000000001和0.00000000000002之间的不精确,但0本身似乎很难搞砸,因为它什么都没有.如果你对什么都不精确,那就不再是什么了.
但我对这个话题知之甚少,所以我不能说.
double x = 0.0;
return (x == 0.0) ? true : false;
Run Code Online (Sandbox Code Playgroud)
这会永远回归真实吗?
到目前为止,我已经看到很多关于浮点数相等的帖子.对于"我们应该如何决定x和y是否相等?"这样的问题的标准答案.是
abs(x - y) < epsilon
Run Code Online (Sandbox Code Playgroud)
其中epsilon是一个固定的小常数.这是因为"操作数"x和y通常是涉及舍入误差的某些计算的结果,因此标准相等运算符==不是我们的意思,我们应该问的是x和y是否接近,不相等.
现在,我觉得如果x与y"几乎相等",那么x*10 ^ 20也应该与y*10 ^ 20"几乎相等",因为相对误差应该是相同的(但是"相对的" "到底是什么?" 但是对于这些大数字,上述测试将失败,即该解决方案不会"扩展".
你会如何处理这个问题?我们应该重新调整数字还是重新调整epsilon?怎么样?(或者我的直觉是错的吗?)
这是一个相关的问题,但我不喜欢它接受的答案,因为reinterpret_cast对我来说似乎有点棘手,我不明白发生了什么.请尝试提供简单的测试.
我有一个非常奇怪的情况,我不明白.以下是简化的案例:
double? d = 2;
int? i = 2;
Console.WriteLine(d.Equals((2))); // false
Console.WriteLine(i.Equals((2))); // true
Run Code Online (Sandbox Code Playgroud)
我不明白为什么一个表达式会使我真实而另一个表达错误.它们似乎相同.
我刚刚阅读了有关浮点值比较的声明
不能使用==或!=运算符比较浮点值.大多数浮点值没有精确的二进制表示,并且精度有限.
如果是这样,比较两个浮点值的最佳方法是什么?
直接比较.net中的浮点数(double,float)是否相等是不安全的.变量中的double值可能会随着时间的推移而变化很小.例如,如果将变量num(double)设置为对象的0.2,则在该对象在内存中等待一段时间后,您可能会发现num变为0.1999999999999.因此,在这种情况下,num == 0.2将为false.我对此问题的解决方案是创建一个属性来舍入数字:
double Num
{
get{ return Math.Round(num, 1); }
}
Run Code Online (Sandbox Code Playgroud)
调用Num的get并返回结果后,在比较时(Num == 0.2),这个返回的数字是否会再次变为0.19?它不太可能但是有保证吗?
我有一个函数,它接受两个参数,如果它们相等则返回 true,如果不相等则返回 false:
private bool isequal(object a, object b)
{
if (a != null)
return a.Equals(b);
if (b != null)
return b.Equals(a);
//if (a == null && b == null)
return true;
}
Run Code Online (Sandbox Code Playgroud)
现在我想扩展这个功能。如果 a 和 b 是 2 个相同的数字但类型不同,它也应该返回 true。
例如:
int a = 15;
double b = 15;
if (isequal(a,b)) //should be true; right now it's false
{ //...
}
Run Code Online (Sandbox Code Playgroud)
我已经找到了一个类似的问题(带有答案)比较 double 和 int 的最佳方法,但 a 和 b 可以是任何类型的数字或数字以外的其他数字。如何检查 a 和 b 是否是数字?我希望有一种比检查 .net 的所有现有数字类型(Int32、Int16、Int64、UInt32、Double、Decimal,...)更好的方法
// …
我想实现球物理,作为新手,我在教程http://adam21.web.officelive.com/Documents/JavaPhysicsTutorial.pdf中修改了代码 .
我试着尽可能地遵循它,但我不能在代码中应用所有物理现象,有人可以请告诉我,我错误或我仍在做一些愚蠢的编程错误.
当我没有调用弹跳方法并且我无法利用弹跳方法并且球向左侧移动而不是在地板上跌落/结束时,球正在移动**,
有些身体可以推荐我一些更好的方法或类似的简单方法来完成这个任务,在两个球或更多的球交互性上应用物理.
这是代码;
import java.awt.*;
public class AdobeBall {
protected int radius = 20;
protected Color color;
// ... Constants
final static int DIAMETER = 40;
// ... Instance variables
private int m_x; // x and y coordinates upper left
private int m_y;
private double dx = 3.0; // delta x and y
private double dy = 6.0;
private double m_velocityX; // Pixels to move each time move() is called.
private …Run Code Online (Sandbox Code Playgroud) c# ×4
comparison ×4
.net ×3
algorithm ×1
c++ ×1
java ×1
math ×1
nullable ×1
numeric ×1
optimization ×1
physics ×1
precision ×1
simulation ×1
zero ×1