【问题标题】:How does float operations works in c? Big numbers weird results浮点运算如何在 c 中工作?大数字奇怪的结果
【发布时间】:2013-04-03 17:12:50
【问题描述】:

以下代码给出了一些奇怪的结果:

#include <stdio.h>
#include <float.h>

int main()
{
    float t = 1.0;  
    float res;
    float myFltMax = 340282346638528859.0;
    printf("FLT_MAX %f\n", FLT_MAX);

    res = FLT_MAX - t;
    printf("res %f\n", res);

    res = myFltMax - t;
    printf("res myFltMax %f\n", res);

    return 1;

}

结果是:

FLT_MAX 340282346638528859811704183484516925440.000000
res 340282346638528859811704183484516925440.000000
res myFltMax 340282356122255360.000000

所以,如果我从 FLT_MAX 中减去 1,结果是相同的,如果我从其他大浮点数中减去 1,则结果大于初始数字。

我使用的是 gcc 版本 4.7.2。 谢谢。

【问题讨论】:

  • ...提示this fantastic document! :)
  • 其实,如果你想得到或多或少精确的结果,你应该避免这样的操作。如果数字具有相同的 10 次方,您将获得最佳结果。
  • 浮点(以及双精度或任何其他浮点格式)没有无限精度

标签: c floating-point


【解决方案1】:

如果你从myFltMax 中减去 1,你得到的差值不会大于初始数字。你得到相同的号码。也打印myFltMax,你会看到它是340282356122255360,而不是340282346638528859

Proof.

基本上,编译器会将您的 340282346638528859 舍入为可以用浮点类型表示的最接近的值,并且恰好是 340282356122255360

【讨论】:

  • 的确如此,结果是一样的,但为什么不少呢?我应该从该值中减去什么以获得不同的结果?
  • 在 cmets 中,您获得了一篇精彩论文的链接。研究它和浮点格式。
猜你喜欢
  • 1970-01-01
  • 2013-04-27
  • 2011-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-03
  • 2012-08-22
  • 2017-04-04
相关资源
最近更新 更多