分工和浮点

时间:2012-06-16 02:21:01

标签: c floating-point floating-accuracy

任何人都可以帮助我为什么x2打印零。 我想因为浮点表示X1四舍五入,有没有办法保持进动。

long double x1, x2;
x1= 0.087912088; // Note: 360/4095 = 0.087912088
x2 = 360/4095;
printf("%Lf, %Lf \n",x1, x2);

结果:

x1 =0.087912
x2= 0.000000

2 个答案:

答案 0 :(得分:10)

问题是整数截断 ..你要划分两个整数=>结果将是另一个整数,其中小数部分被丢弃。 (例如,在整数除法的实际结果为3.9的情况下,截断将使其为3(即,它不会舍入)。

在您的情况下,如果您将其更改为:

x2 = 360 / 4095.0;  /* one of the operands now has a decimal point */

你会得到

0.087912, 0.087912 

作为输出。

即,只要除法运算符/的操作数中的一个或两个都是浮点数/双精度数,结果也是如此(即,它将被“提升”为浮动/双)。所以我可以将x2更改为

x2 = 360.0 / 4095.0;

x2 = 360.0 / 4095;

并且会得到与上面相同的结果。

正如@chris所提到的那样,使用.就足够了。

回答上面关于精确度的问题:

你已经在使用长双打..我不认为你在内部可以改变任何东西,除非你使用一些特殊的库,但你当然可以显示更多的数字。例如,

  printf("%Lf, %.20Lf \n",x1, x2); 

将产生

  0.087912, 0.08791208791208791895 

最后,正如@ edA-qa mort-ora-y提醒我们的那样,您也可以值转换为某些类型,但 时这很重要。一个简单的示例(请注意,在任何情况下float之后分配后,值最终为v

float

答案 1 :(得分:3)

内置运算符处理相同类型的对象。结果与参数的类型相同。在这种情况下,除法是在两个整数上完成的,因此结果是整数。

x2 = 360/4096;
//   int/int  = int

因此我希望得到0的结果。

如果内置类型的运算符不同,则会提升它们以使它们具有相同的类型(结果也是该类型)。所以你想要的是:

x2 = 1.0 * 360/4095;  // or 360.0/4095

// This is
    double * int / int

==> (double * double)/int
==> (double * double)/double