浮点C ++算术运算

时间:2010-07-22 03:55:59

标签: c++ floating-point

有没有一种方法在C ++中让它将每个浮点运算评估为double,即使参数是int?我有一个程序和许多地方,我有代码,如1 / 2,5 / 6。在这些情况下,C ++将结果转换为int,这会搞砸整个计算。从财务计算的角度来看,除了'cmath'之外还有其他我可以使用的库,它们将包含更多高级函数。

3 个答案:

答案 0 :(得分:4)

在C(以及C ++)中,所有内置运算符(即POD)都在same type的对象上运行。因此,如果内置运算符的参数具有不同的类型,则编译器将隐式地转换它们(通常)它们(根据明确定义的规则),以便它们都是相同的。运算符的结果也与输入参数的类型相同。

你看到的是整数除法,它返回一个整数。

隐式投射规则:

1) If either value is long double then cast the other to long doubele  (technically only C)
2) If either value is      double then cast the other to      double
3) If either value is      float  then cast the other to      float
4) If either value is unsi long   then cast the other to unsi long
5) If either value is      long   then cast the other to      long
6) If either value is unsi int    then cast the other to unsi int
7) Cast both values to int

注意:所有算术运算至少在int上完成。这意味着如果两个参数都是(u)short和/或char,则它们都被转换为int。

从这里我们可以看到,要使操作在双打上发生,那么至少有一个参数必须是代码中的双精度。要做到这一点,只需在表达式中添加一个小数部分。

int val = 1.0/2;

// This is equivalent to:

int val = static_cast<int>( 1.0 / static_cast<double>(2));
// Are you not glad the compiler does the implicit cast for you :-)

答案 1 :(得分:3)

  

在这些情况下,C ++将结果转换为int,这会搞砸整个计算

不,在这些情况下,因为两个操作数都是整数,所以你明确地执行整数除法;根本没有铸造。

正确的答案是执行浮点除法:

1.0/2

答案 2 :(得分:1)

Martin York对正在发生的事情有一个很好的解释,James McNellis为你提供一个体面的答案,如果你使用文字,该怎么办。

如果您使用的是int / float / short / etc变量,那么您可以通过内联将它们强制转换来解决这个问题。 e.g。

double Average(int *values, int count)
{
    int sum = 0;
    for(int i = 0; i < count; ++i) sum += values[i];
    return sum / (double) count; // Cast one of the values to double, that will force both to be calculated as doubles
    // note that "return (double)sum / count;" won't work because operator precendence
    // causes this to translate to "return (double)(sum / count);"

    // the "c++ way" to do this would be through the static_cast operator
    // i.e. "return static_cast<double>(sum)/count;"
    //  or  "return sum/static_cast<double>(count);"
    // both of which are very explicit in what you are casting
}