gpt4 book ai didi

c - float 与 double 比较

转载 作者:行者123 更新时间:2023-12-03 21:03:09 24 4
gpt4 key购买 nike

int main(void)
{
  float me = 1.1;  
double you = 1.1;   

if ( me == you ) {
printf("I love U");
} else {
printf("I hate U");
}
}

这会打印“我讨厌你”。为什么?

最佳答案

float 使用二进制分数。如果您转换1.1 float ,这将导致二进制表示。如果二进制小数点的每一位都将数字权重减半,就像十进制一样,它会除以十。小数点左边的位 double (十进制乘以十)。

in decimal: ... 0*2 + 1*1 + 0*0.5 + 0*0.25 + 0*0.125 + 1*0.0625 + ...
binary: 0 1 . 0 0 0 1 ...
2's exp: 1 0 -1 -2 -3 -4
(exponent to the power of 2)

问题是1.1无法精确转换为二进制表示形式。然而,对于 double ,比 float 有更多的有效数字。

如果比较值,首先,浮点型将转换为 double 型。但由于计算机不知道原始十进制值,它只是用所有 0 填充新 double 的尾随数字。 ,而 double 值更精确。所以两者比较并不相等。

这是使用 float 时的常见陷阱。由于这个原因和其他原因(例如舍入误差),您不应使用精确比较(等于/不等于),而应使用不同于 0 的最小值进行范围比较:

#include "float.h"

...
// check for "almost equal"
if ( fabs(fval - dval) <= FLT_EPSILON )
...

注意 FLT_EPSILON 的用法,它是前面提到的单精度值 float值(value)观。另请注意 <= ,不是< ,因为后者实际上需要完全匹配)。

如果比较两个 double 值,则可以使用 DBL_EPSILON,但要小心。

根据中间计算,必须增加容差(不能将其减小到超过 epsilon),因为舍入误差等会累积起来。一般来说, float 不会容忍关于精度、转换和舍入的错误假设。

编辑:

正如 @chux 所建议的,对于较大的值,这可能无法按预期工作,因为您必须根据指数缩放 EPSILON。这符合我所说的:浮点比较并不像整数比较那么简单。比较之前先考虑一下。

关于c - float 与 double 比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30808556/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com