【问题标题】:How to overflow a float?如何溢出浮点数?
【发布时间】:2017-08-22 09:30:00
【问题描述】:

我正在努力解决“C 编程语言”中的练习 2.1,其中应该在本地机器上计算不同类型的范围,如 char、short、int 等,但也包括 float 和 double。除了 float 和 double 我观察溢出的发生,因此可以计算最大值/最小值。但是,通过浮动,这仍然不起作用。

那么,问题是为什么这段代码会打印两次相同的值?我认为第二行应该打印inf

float f = 1.0;
printf("%f\n",FLT_MAX);
printf("%f\n",FLT_MAX + f);

【问题讨论】:

标签: c floating-point


【解决方案1】:

尝试乘以 10,如果会溢出。它不会溢出的原因与将一个小浮点数添加到一个已经非常大的浮点数实际上根本不会改变值的原因相同——它是一种浮点格式,这意味着精度的位数是有限的。

或者,至少添加最后一个有效数字可能会起作用:

float f = 3.402823e38f; // FLT_MAX
f = f +   0.000001e38f; // this should result in overflow

【讨论】:

  • 反复试验导致这是使其溢出的最小操作:` printf("%f\n", FLT_MAX * 1.00000006f);` (至少在我的设置中)
  • 0.000001e38f 确认添加也可以
【解决方案2】:

它两次打印相同值的原因是1.0 太小而无法添加到FLOAT_MAXfloat 通常有 24 位用于尾数,8 位用于指数。如果您有一个指数为 127 的非常大的值,则需要一个至少 127 位的尾数才能添加 1.0

例如,十进制(和任何其他)指数值也存在同样的问题: 如果您有一个具有 3 位有效数字的数字,例如 1.00*106,则不能向其添加 1,因为这将是 1'000'001,这需要 6 个有效数字。

您可以通过重复将值加倍来溢出float

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 2018-02-17
    • 1970-01-01
    • 2013-07-10
    • 1970-01-01
    相关资源
    最近更新 更多