任何人都可以帮助我为什么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
答案 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提醒我们的那样,您也可以将值转换为某些类型,但 时这很重要。一个简单的示例(请注意,在任何情况下1}} 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