比较c中的2个值总是返回false

Mam*_*men 2 c

我做一个简单的程序来证明一个正确的triange,然后我使用pow函数来多次输入像;

if(pow(c,2) == (pow(a,2) + pow(b,2))){
   printf("True.");
}else{
   printf("False.");
}
Run Code Online (Sandbox Code Playgroud)

然后我输入了值a = 3, b = 4, c = 5,它应该是真的,因为25 == 25 它返回了一个假,

但如果我将代码更改为:

if((c*c) == ((a*a) + (b*b))){
   printf("True.");
}else{
   printf("False.");
}
Run Code Online (Sandbox Code Playgroud)

结果是真的

nb: input is a double

对此错误的任何解释?谢谢

Bat*_*eba 6

pow(x, y)通常实现为exp(y log x).即使看似微不足道的参数值,这也可能会有所不同.

你看到了这个的影响.

处理浮点精度问题没有硬性规定.与容差相比,通常被认为是一种解决方案,但选择容忍度或应用方式本身并不是微不足道的.

在您的情况下,最好进行比较a * a + b * b,c * c;特别是如果它们始终是整数值.