【发布时间】: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 int a;
long long int b;
long long int c;
long long int d=a*b/c;
但是,我希望 'd' 是双倍的。有没有一种方法可以乘法、除法 long long int 并得到一个 double 作为答案,并保持 3 位小数作为精度?
谢谢
【问题讨论】:
将(至少)long long ints 之一转换为 double
double d = a * (double)b / c;
【讨论】:
long longs 的乘除法(尽管显然是最好的方法)。当只转换c 时,a * b 中可能存在整数溢出。
如果这样做不会使您的数字溢出,您可以将所有内容乘以 1000。此外,请确保您始终在除以之前乘以。您可以转换为双精度,但它可能会丢失信息。
【讨论】:
由于 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 中完成乘法和除法。
【讨论】:
说double d = double(a) * double(b) / double(c); 以获得浮点结果。 (实际上,您只需要 one 元素成为 double 就可以提升所有内容,但为什么不明确。)您可以获得双精度浮点的通常精度(即您没有选择一个“精度级别”)。
您确定需要浮点点算术(即您的问题是否需要多个刻度)?也许定点算术更适合您的情况。
【讨论】: