【问题标题】:My code is ignoring small floats when adding and dividng我的代码在添加和划分时忽略了小浮动
【发布时间】:2014-11-30 05:06:24
【问题描述】:

对于类,我们得到了一个代码,该代码基本上采用数字 10000000000、3、-10000000000 和 5,将它们打印出来,将它们相加,然后将它们除以 4 以求平均值。它们都被标记为浮点数,当代码吐出平均值时,它会忽略等式中的 3 和 5。我发现用“double”替换“const float”可以修复它,但任务是找到一种方法来做到这一点而不改变标识符类型。有人有什么想法吗?

#include <iostream>
#include <iomanip>
#include <cmath>



using namespace std;



int main(void)

{

   const float YEAR_ONE = 10000000000;

   const float YEAR_TWO = 3;

   const float YEAR_THREE = -10000000000;

   const float YEAR_FOUR = 5;

   int numberOfYears = 4;



   float average = YEAR_ONE + YEAR_TWO;

   average += YEAR_THREE + YEAR_FOUR;

   average = average/numberOfYears;

   cout << fixed;
   cout << setprecision(2);

   cout << "1998 earnings were: $" << YEAR_ONE << endl;

   //Prints the amount earned in 1998

   cout << "1999 earings were: $" <<  YEAR_TWO << endl;

   //Prints the amount earned in 1999

   cout << "2000 earnings were: $" << YEAR_THREE << endl;

   //Prints the amount earned in 2000

   cout << "2001 earnings were: $" << YEAR_FOUR << endl;

   //Prints the amount earned in 2001

   cout << "Average earnings was: $" << average << endl;

   //Prints the average amount earned between 1998 and 2001



return 0;

}

【问题讨论】:

  • 好吧,浮点数一开始就没有很高的精度。数字越大,精度实际上就会下降。所以......真的没有惊喜。
  • 听起来这个练习是为了教你一些东西。到目前为止你学到了什么?你能把它和你在课堂上讲过的东西联系起来吗?
  • 如果您无法更改数据类型,请考虑将这些值相加的顺序。
  • 这些数字对于float 来说太大了。存储它们会牺牲精度。
  • 顺便说一句,“标识符”是您为变量选择的名称,它不是类型。因此,如果您的作业明确指出您不应更改 IDENTIFIERS,那么请务必将所有这些变量更改为双精度并保留现有名称;)

标签: c++ floating-point add average division


【解决方案1】:

好吧,每个人都在拐弯抹角。所以我会给你一个正确的方向。

float average = YEAR_ONE + YEAR_TWO;

想想上面的那个值。它适合浮子吗?否 - YEAR_TWO 的值太小,无法添加到 YEAR_ONE,所以您会发现 YEAR_ONE + YEAR_TWO == YEAR_ONE

您添加到 average 的另一个值 (YEAR_THREE + YEAR_FOUR) 也是如此。

那么您如何重新排列添加的顺序。你可以让那些讨厌的大价值观消失。这似乎是作业要求的内容,旨在帮助您理解浮点精度的一些陷阱

我想你知道该怎么做...

【讨论】:

    【解决方案2】:

    这就是float 的工作原理;它不如 double 精确。
    给出一个(简化的)想法,存储数字:

    2 => 2.00000 * 10^0
    0.01 => 1.00000 * 10^(-2)
    10000000000 => 1.00000 * 10^10
    

    它可以存储大约 5 个十进制数字,其他一切都由指数管理。
    像 10000000003 这样的值将是
    1.00000 00003 * 10^10
    切掉白色部分。

    更详细的说明如何存储值:http://en.wikipedia.org/wiki/IEEE_754

    【讨论】:

      猜你喜欢
      • 2014-10-05
      • 1970-01-01
      • 1970-01-01
      • 2011-05-06
      • 1970-01-01
      • 1970-01-01
      • 2020-11-21
      • 2018-07-10
      • 1970-01-01
      相关资源
      最近更新 更多