使用浮点数时,有时会出现舍入问题。因此,通常不建议将计算结果与==或!=进行比较,而是使用适当的约束abs(a-b)<1.0e-10
。
但是用它来与0.0
比较是否合适?
以下是我所说的:
double foo(){
//code which can return values that aren't 0.0
//all returns are either literals or global variables defined with literals
return 0.0;
}
此处f
将始终返回0.0
或明确不是0.0
的数字。具体而言,这些数字的幅度都大于0.1
但小于2.0
。
如果0.0==foo()
返回true
,0.0
总是0.0==foo()
吗? true
如果foo
返回0.0
以外的值,import cv2
def grey():
img = cv2.imread('1.jpg')
for x in range(img.shape[0]):
for y in range(img.shape[1]):
if img[x,y,0] == img[x,y,1] == img[x,y,2]:
grey = img
else:
grey = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
return grey
是否有可能成为 ngOnInit(){
this.reset();
}
reset(){
this.hero = new Hero(1,'Plunker');
}
cancel(myForm){
this.reset();
}
?
答案 0 :(得分:1)
最多std::numeric_limits::digits<float>
你是安全的。这是因为尾数是整数类型(通常是特定于平台的uint;然后通过符号位和指数扩展到浮点数。)
http://en.cppreference.com/w/cpp/types/numeric_limits/digits
答案 1 :(得分:1)
在您的情况下,使用浮点等式== 0.0
完全正确。
它完全符合函数的意图(如果失败则返回一些值或0.0)。使用任何其他epsilon在某种程度上是任意的,需要知道正确值的范围。如果有任何改变可能是值的范围而不是0,那么测试== 0.0
并不比其他解决方案IMO更具前瞻性。
我看到的唯一问题是一些编译器会警告可疑的平等使用(-Wfloat-equal)...这对于int a,b,c; ...; c=a+b;
的警告是有用的,因为这样的指令可能会导致问题(整数溢出和未定义的行为)。奇怪的是,我从未见过第二次警告。
因此,如果您希望使用-Wall -Werror编译器选项将来证明,您可能会以不同方式编码失败(例如,使用负值)并测试foo&lt; 0.0 - 直到有人发现浮点不等式也可能需要容忍并将结构声明为可疑。
答案 2 :(得分:0)
如果你返回一个文字0.0
然后是,但它通常不是一个好主意,因为虽然今天这是真的,你能确定在维护或代码重用下它仍然是真的。更好地编写可在更广泛的环境中工作的东西。在这种情况下:
foo() < 0.1
对于您指定的所有值,将返回false。更通用的解决方案是测试足够接近零:
static const EPSILON = 0.00001 ;
std::fabs( foo() - 0.0 ) < EPSILON ;
最好使用上述模式之一,因为它不需要foo()
来保证“零”的精度。