【问题标题】:long long int arithmeticslong long int 算术
【发布时间】:2012-02-02 22:08:49
【问题描述】:

我在 C 中有以下内容:

long long int a;
long long int b;
long long int c;
long long int d=a*b/c;

但是,我希望 'd' 是双倍的。有没有一种方法可以乘法、除法 long long int 并得到一个 double 作为答案,并保持 3 位小数作为精度?

谢谢

【问题讨论】:

    标签: c long-long


    【解决方案1】:

    将(至少)long long ints 之一转换为 double

    double d = a * (double)b / c;
    

    【讨论】:

    • 严格来说,这不再是long longs 的乘除法(尽管显然是最好的方法)。当只转换c 时,a * b 中可能存在整数溢出。
    【解决方案2】:

    如果这样做不会使您的数字溢出,您可以将所有内容乘以 1000。此外,请确保您始终在除以之前乘以。您可以转换为双精度,但它可能会丢失信息。

    【讨论】:

      【解决方案3】:

      由于 C 表达式(包括子表达式)的计算通常不考虑它们出现的上下文,因此子表达式 a*b/c 将使用整数运算进行计算,这意味着截断除法。

      如果要对整数值执行浮点运算,则需要将它们转换为浮点类型。这应该适用于您的情况:

      long long int a;
      long long int b;
      long long int c;
      /* Assign values to a, b, and c (!) */
      double d = (double)a * b / c;
      

      请注意,仅转换第一个操作数就足以导致在类型 double 中完成乘法和除法。

      【讨论】:

        【解决方案4】:

        double d = double(a) * double(b) / double(c); 以获得浮点结果。 (实际上,您只需要 one 元素成为 double 就可以提升所有内容,但为什么不明确。)您可以获得双精度浮点的通常精度(即您没有选择一个“精度级别”)。

        您确定需要浮点点算术(即您的问题是否需要多个刻度)?也许定点算术更适合您的情况。

        【讨论】:

        • 在我的计算中,我可能会得到 5.115,其中 115 至关重要,但是任何大于 100 的数字我都不关心得到的小数。你有什么其他的方法吗?
        • 我以为我刚刚做了 - 固定点算术。请参阅@Keith 的回答。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-02-01
        • 1970-01-01
        • 1970-01-01
        • 2016-07-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多