使用浮点值

时间:2017-10-11 21:36:46

标签: c++ floating-point double equality

使用浮点数时,有时会出现舍入问题。因此,通常不建议将计算结果与==或!=进行比较,而是使用适当的约束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()返回true0.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(); }

3 个答案:

答案 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()来保证“零”的精度。