klm*_*123 4 c++ floating-point
可疑问题是:将浮点数与零进行比较的标准方法是什么?
据我所知直接比较:
if ( x == 0 ) {
// x is zero?
} else {
// x is not zero??
Run Code Online (Sandbox Code Playgroud)
可以使用浮点变量失败.
我以前用过
float x = ...
...
if ( std::abs(x) <= 1e-7f ) {
// x is zero, do the job1
} else {
// x is not zero, do the job2
...
Run Code Online (Sandbox Code Playgroud)
我在这里找到相同的方法.但我看到两个问题:
这是一个常见的比较,我想知道是否有一个标准的简短方法来做到这一点.喜欢
x.is_zero();
Run Code Online (Sandbox Code Playgroud)
要将浮点值与 0 进行比较,只需比较它:
if (f == 0)
// whatever
Run Code Online (Sandbox Code Playgroud)
这种比较没有任何问题。如果它没有按照你的预期运行,那是因为它的价值f不是你想象的那样。它本质上与此相同的问题:
int i = 1/3;
i *= 3;
if (i == 1)
// whatever
Run Code Online (Sandbox Code Playgroud)
这种比较并没有错,但 的值i不是 1。几乎所有程序员都理解整数值的精度损失;许多人不理解浮点值。
使用“几乎相等”代替==是一种高级技术;它经常导致意想不到的问题。例如,它不是可传递的;也就是说,a几乎等于b和b几乎等于c它不意味着a几乎等于c。
没有标准的方法,因为你是否想要将一个小数字视为零,取决于你如何计算数字和它的用途.这又取决于计算引入的任何误差的预期大小,也可能取决于确定原始输入的物理测量误差.
例如,假设您的值表示某些地图软件中的行程长度(以英里为单位).那么你很乐意将它1e-7视为等于零,因为在这种情况下它是一个非常小的数字:它是由于舍入误差或其他轻微不精确的原因而产生的.
另一方面,假设您的值代表某些电子显微镜软件中分子的大小(以米为单位).那么你当然不希望1e-7等同于零,因为在那种情况下它是一个非常大的数字.
您应该首先考虑什么是合适的准确度来呈现您的价值:什么是误差条,或者您可以合理地显示多少有效数字.这将让你对使用什么样的容差进行测试,以便对零进行测试,尽管它仍然可能无法解决问题.对于地图软件,如果旅程小于某个固定值,您可以将旅程视为零,尽管该值本身可能取决于地图的分辨率.对于显微镜软件,如果两个尺寸之间的差别在于零在于这些测量的95%的误差范围内,仍然可能不足够来形容他们为相同的大小.