【问题标题】:float - c data typesfloat - c 数据类型
【发布时间】:2012-10-18 05:45:52
【问题描述】:
int main() {
float a = 20000000;
float b = 1;
float c = a+b;

if (c==a) { printf("equal"); }

else { printf("not equal");}
return 0;
}

当我运行它时,它显示“相等”。 但是当我将 a 的值更改为 2000000(少一个零)时,答案是否定的。 为什么?

【问题讨论】:

  • 相对较小的值(此处为 1)添加到较大的值后完全消失的机制在浮点词汇表中称为“吸收”。

标签: c types floating-point floating-point-precision


【解决方案1】:

通常,float 的精度为 24 位。数字 20000001 = 0x1312d01 需要 25 位才能准确表示,所以必须四舍五入。对于恰好位于两个可表示值之间的值,正常的舍入模式是舍入到最后一位零,因此 20000001 会作为 float 舍入到 20000000。

2000001 = 0x1e8481 需要少于 24 位来表示 (21),因此不需要四舍五入。

【讨论】:

  • 不,2000000 =0x1e8480。如果最后一个半字节是奇数,则该数字必须是奇数。
  • 你如何计算这个数字 0x1312d01 ?
  • @wantToLearn printf("%a", 20000000.f); 可能很有用——尽管您在尝试printf("%a", 20000001.f); 时可能会感到困惑。
  • 我问了我的 Haskell 解释器,这比手动操作要快。但是手工操作也很简单。您从最低有效位到最高位(从右到左)确定位,如果数字为奇数,则最后一位为 1,否则为 0。将数字除以 2(丢弃小数部分)。重复直到达到 0。在 C 中,您可以使用 %x 格式打印十六进制的无符号整数。
【解决方案2】:

浮点数通常是近似值而不是精确值。您可以在这里阅读所有相关信息:

http://en.wikipedia.org/wiki/Floating_point

【讨论】:

    【解决方案3】:

    如果您将两个变量声明为浮点类型,那么即使您将这两个值相同。如果你比较相等,你会得到不可预测的结果。有关表示浮点数的 IEEE 标准 (IEEE 754) 的更多详细信息。 wikipedia article

    【讨论】:

    • 在链接到一篇解释浮点运算在 1985 中标准化的 Wikipedia 文章时,声称“如果比较相等会得到不可预测的结果”是否自相矛盾?为了可预测性?
    • @PascalCuoq 如果文章清楚地解释了浮点数可能被四舍五入,如何以及为什么
    【解决方案4】:
    猜你喜欢
    • 1970-01-01
    • 2023-02-23
    • 2021-09-27
    • 1970-01-01
    • 1970-01-01
    • 2018-01-25
    • 1970-01-01
    • 2021-08-11
    • 1970-01-01
    相关资源
    最近更新 更多